栈的基本操作

更新时间:2024-07-09 17:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

栈的基本操作

题目:栈的基本操作(顺序存储和链式存储任选一种)

一需求分析

了解顺序栈,链式栈的定义;程序构建了进栈,出栈,空栈,和满栈等操作。

二、概要设计

1;/* 顺序栈的定义*/ #define MAXSIZE 100 typedef int ElemType; typedef struct{

ElemType data[MAXSIZE]; int top; }sqStack;

/* 链式栈的定义*/ typedef struct Lstack{ ElemType data; struct Lstack *next; }Lstack

2;/*创建一个顺序栈*/ void Create_Sqs(sqStack *s) {

int i, n;

printf(\ scanf(\ for (i = 1; i <= n; i++) scanf(\ s->top = n; }

2、本程序包含五个模块:

(1)主程序模块: void main(){

定义头文件;

定义类型; 接受命令; 处理命令; 输出; }

第 1 页 共 7 页

(2)顺序栈,链式栈的定义; (3)输入输出栈元素; (4)创建循环队列;

(5)入队,出队,输出值; 三、详细设计

1、定义头文件

#include #include 2、 类型定义,类型声明 /* 顺序栈的定义*/ #define MAXSIZE 100 typedef int ElemType; typedef struct{

ElemType data[MAXSIZE]; int top; }sqStack;

/* 链式栈的定义*/ typedef struct Lstack{ ElemType data; struct Lstack *next; }Lstack;

/*练习的主要内容,是栈和队列的基本操作*/ /*创建一个顺序栈*/

void Create_Sqs(sqStack *s) {

int i, n;

printf(\ scanf(\ for (i = 1; i <= n; i++) scanf(\ s->top = n; }

/*输出栈元素*/

void out_Sqs(sqStack *s) {

int i;

if (s->top == 0) { return; }

for (i = s->top; i > 0; i--) {

第 2 页 共 7 页

printf(\ }

printf(\}

/*进栈一个元素*/

void push(sqStack *s, ElemType e) {

if (s->top == MAXSIZE - 1) { printf(\ } else { s->top = s->top + 1; s->data[s->top] = e; } }

/*出栈一个元素*/

ElemType pop(sqStack *s) {

int x;

if (s->top == 0) { printf(\ return(-1); } else { x = s->data[s->top]; s->top = s->top - 1; return(x); } }

/* 循环队列的定义*/ typedef struct{

ElemType elem[MAXSIZE];

int front; //头指针,若队列不空,指向队头元素;

int rear; //尾指针,若队列不空,指向队尾元素的下一个位置 int full; }SqQueue;

/*创建一个循环队列*/

第 3 页 共 7 页

void create_sqQ(SqQueue * S) {

int n = 0; int i = 0;

ElemType data;

/*首先构造一个空队列*/ S->front = S->rear = 0; S->full=0;

/* 输入元素个数*/ printf(\ scanf(\ if (n > MAXSIZE) { printf(\ return; }

/*逐步输入元素的值*/ for (i = 0; i < n; i++) { scanf(\ S->elem[S->rear] = data; S->rear = (S->rear + 1) % MAXSIZE; if (S->rear == S->front) { printf(\ return; } }

return; }

/* 入队*/

ElemType EnQueue(SqQueue *S, ElemType e) {

if (S->rear == S->front) { printf(\ return (-1); }

S->elem[S->rear] = e;

S->rear = (S->rear + 1)% MAXSIZE; return e; }

/* 出队 */

第 4 页 共 7 页

ElemType delQueue(SqQueue * S) {

ElemType e;

if (S->front == S->rear && S->full==0) { printf(\ return(-1); }

e = S->elem[S->front];

S->front = (S->front + 1) % MAXSIZE; S->full=0; return e; }

/* 输出队列*/

void output_Queue(SqQueue *S) {

int i = 0;

if (S->front == S->rear && S->full==0) { printf(\ return; }

i = S->front;

while (i != S->rear) { printf(\ i = (i + 1) % MAXSIZE; }

printf(\ }

主函数: void main() {

sqStack s; SqQueue S; ElemType e; Create_Sqs(&s); out_Sqs(&s); push(&s, 10); out_Sqs(&s);

printf(\ out_Sqs(&s); system(\

第 5 页 共 7 页

}

/* 以下是循环队列的测试*/ create_sqQ(&S); output_Queue(&S); EnQueue(&S, 10); output_Queue(&S); e = delQueue(&S); printf(\output_Queue(&S); system(\return;

四,调试分析:

1、对顺序和链式栈的定义、节点类型和长度 ;输出栈元素 输出栈元素和进栈一个元素;创建一个循环队列首先构造一个空队列输入元素个数 ;这些对循环队列的测试包括输出和加入元素。

2、对循环队列定义头指针,若队列不空,指向队头元素;尾指针,若队列不空,指向队尾元素的下一个位置。所以增加 int full;用以判断对full赋值为0或者1。

3、 创建循环队列首先构建一个空队列在向空队列里输入元素,再判断元素是否满栈,用full判断,对循环队列输出元素时要判断是否为空,。

第 6 页 共 7 页

五 、运行结果

五、实验环境

(1) 编程环境:VC6.0++

六、实验体会

通过本次实验我了解到如何构建顺序栈,链式栈以及循环队列;还有结构的创建、进栈(入队)、出栈(出队)等操作,(实现栈(队)空和栈(队)满)等让我感觉到其操作的便利性,获益匪浅,但在操作过程中我也感到自己知识的不足,做起来有些困难,今后还需丰富知识与加强操作熟练程度。

第 7 页 共 7 页

本文来源:https://www.bwwdw.com/article/ma2.html

Top