实验二栈、队列的实现及应用讲解
栈和队列的实验报告

栈和队列的实验报告栈和队列的实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在算法设计和程序开发中起着重要的作用。
本实验旨在通过实际操作和观察,深入理解栈和队列的概念、特点以及它们在实际应用中的作用。
一、栈的实验1.1 栈的定义和特点栈是一种具有特殊操作约束的线性数据结构,它的特点是“先进后出”(Last-In-First-Out,LIFO)。
栈的操作包括入栈(push)和出栈(pop),入栈操作将元素放入栈顶,出栈操作将栈顶元素移除。
1.2 实验步骤在本次实验中,我们使用编程语言实现了一个栈的数据结构,并进行了以下实验步骤:1.2.1 创建一个空栈1.2.2 向栈中依次压入若干元素1.2.3 查看栈顶元素1.2.4 弹出栈顶元素1.2.5 再次查看栈顶元素1.3 实验结果通过实验,我们观察到栈的特点:最后入栈的元素最先出栈。
在实验步骤1.2.2中,我们依次压入了元素A、B和C,栈顶元素为C。
在实验步骤1.2.4中,我们弹出了栈顶元素C,此时栈顶元素变为B。
二、队列的实验2.1 队列的定义和特点队列是一种具有特殊操作约束的线性数据结构,它的特点是“先进先出”(First-In-First-Out,FIFO)。
队列的操作包括入队(enqueue)和出队(dequeue),入队操作将元素放入队尾,出队操作将队头元素移除。
2.2 实验步骤在本次实验中,我们使用编程语言实现了一个队列的数据结构,并进行了以下实验步骤:2.2.1 创建一个空队列2.2.2 向队列中依次插入若干元素2.2.3 查看队头元素2.2.4 删除队头元素2.2.5 再次查看队头元素2.3 实验结果通过实验,我们观察到队列的特点:最先入队的元素最先出队。
在实验步骤2.2.2中,我们依次插入了元素X、Y和Z,队头元素为X。
在实验步骤2.2.4中,我们删除了队头元素X,此时队头元素变为Y。
三、栈和队列的应用栈和队列在实际应用中有广泛的应用场景,下面简要介绍一些常见的应用:3.1 栈的应用3.1.1 表达式求值:通过栈可以实现对表达式的求值,如中缀表达式转换为后缀表达式,并计算结果。
栈和队列的应用数据结构实验

实验二(1)1实验题目: 栈和队列的应用2实验内容: 迷宫问题3实验目的: 掌握栈和队列的概念及工作原理,运用其原理完成 实验题目中的内容。
4实验要求: 为了使学生更好的掌握与理解课堂上老师所讲的概 念与原理,实验前每个学生要认真预习所做的实验 内容及编写源程序代码(写在纸上与盘中均可),以 便在实验课中完成老师所布置的实验内容5设计原理:6程序清单及注释说明:#include<stdio.h>#include<stdlib.h>#define M 15#define N 15定义迷宫内点的坐标类型struct mark //{int x;int y;};恋"栈元素,嘿嘿。
struct Element //"{行,y列int x,y; //x下一步的方向int d; //d};链栈typedef struct LStack //{Element elem;struct LStack *next;}*PLStack;/*************栈函数****************/构造空栈int InitStack(PLStack &S)//{S=NULL;return 1;}int StackEmpty(PLStack S)//判断栈是否为空{if(S==NULL)return 1;elsereturn 0;}int Push(PLStack &S, Element e)//压入新数据元素 {PLStack p;p=(PLStack)malloc(sizeof(LStack));p->elem=e;p->next=S;S=p;return 1;}int Pop(PLStack &S,Element &e) //栈顶元素出栈 {PLStack p;if(!StackEmpty(S)){e=S->elem;p=S;S=S->next;free(p);return 1;}elsereturn 0;}/***************求迷宫路径函数***********************/void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2]) {int i,j,d;int a,b;Element elem,e;PLStack S1, S2;InitStack(S1);InitStack(S2);入口点作上标记maze[start.x][start.y]=2; //elem.x=start.x;elem.y=start.y;elem.d=-1; //开始为-1Push(S1,elem);栈不为空 有路径可走while(!StackEmpty(S1)) //{Pop(S1,elem);i=elem.x;j=elem.y;d=elem.d+1; //下一个方向试探东南西北各个方向while(d<4) //{a=i+diradd[d][0];b=j+diradd[d][1];如果到了出口if(a==end.x && b==end.y && maze[a][b]==0) //{elem.x=i;elem.y=j;elem.d=d;Push(S1,elem);elem.x=a;elem.y=b;elem.d=886; //方向输出为-1 判断是否到了出口Push(S1,elem);东 1=南 2=西 3=北 886为则走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n"); printf("\n0=逆置序列 并输出迷宫路径序列while(S1) //{Pop(S1,e);Push(S2,e);}while(S2){Pop(S2,e);printf("-->(%d,%d,%d)",e.x,e.y,e.d);}跳出两层循环,本来用break,但发现出错,exit又会结束程序,选用return还是不return; //错滴o(∩_∩)o...}if(maze[a][b]==0) //找到可以前进的非出口的点{标记走过此点maze[a][b]=2; //elem.x=i;elem.y=j;elem.d=d;Push(S1,elem); //当前位置入栈下一点转化为当前点i=a; //j=b;d=-1;}d++;}}没有找到可以走出此迷宫的路径\n");printf("}建立迷宫*******************//*************void initmaze(int maze[M][N]){int i,j;迷宫行,列int m,n; //请输入迷宫的行数 m=");printf("scanf("%d",&m);请输入迷宫的列数 n=");printf("scanf("%d",&n);请输入迷宫的各行各列:\n用空格隔开,0代表路,1代表墙\n",m,n);printf("\nfor(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&maze[i][j]);printf("\n");你建立的迷宫为o(∩_∩)o...加一圈围墙for(i=0;i<=m+1;i++) //{maze[i][0]=1;maze[i][n+1]=1;}for(j=0;j<=n+1;j++){maze[0][j]=1;maze[m+1][j]=1;}输出迷宫for(i=0;i<=m+1;i++) //{for(j=0;j<=n+1;j++)printf("%d ",maze[i][j]);printf("\n");}}void main(){int sto[M][N];入口和出口的坐标struct mark start,end; //start,end行增量和列增量 方向依次为东西南北 int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//建立迷宫initmaze(sto);//输入入口的横坐标,纵坐标[逗号隔开]\n");printf("scanf("%d,%d",&start.x,&start.y);输入出口的横坐标,纵坐标[逗号隔开]\n");printf("scanf("%d,%d",&end.x,&end.y);MazePath(start,end,sto,add); //find pathsystem("PAUSE");}7.运行与测试及结果。
栈和队列的基本操作实现及其应用

实验二栈和队列的基本操作实现及其应用一_一、实验目的1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。
一_二、实验内容题目一、试写一个算法,判断依次读入的一个以为结束符的字符序列,是否为回文。
所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。
相关常量及结构定义:#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef struct SqStack{ SElemType *base;SElemType *top;int stacksize;}SqStack;设计相关函数声明:判断函数:int IsReverse()栈:int InitStack(SqStack &S )int Push(SqStack &S, SElemType e )int Pop(SqStack &S,SElemType &e)int StackEmpty(s)一_三、数据结构与核心算法的设计描述1、初始化栈/* 函数功能:对栈进行初始化。
参数:栈(SqStack S)。
成功初始化返回0,否则返回-1 */int InitStack(SqStack &S){S.base=(SElemType *)malloc(10*sizeof(SElemType));if(!S.base) //判断有无申请到空间return -1; //没有申请到内存,参数失败返回-1S.top=S.base;S.stacksize=STACK_INIT_SIZE;S.base=new SElemType;return 0;}2、判断栈是否是空/*函数功能:判断栈是否为空。
参数; 栈(SqStack S)。
栈为空时返回-1,不为空返回0*/int StackEmpty(SqStack S){if(S.top==S.base) return -1;else return 0;}3、入栈/*函数功能:向栈中插入元素。
实验二栈和队列(基本操作)讲解

实验二栈和队列1、实验目的:(1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。
2、实验要求:(1)复习课本中有关栈和队列的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。
3、实验内容[实验1] 栈的顺序表示和实现实验内容与要求:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p—〉top= =MAXNUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误.通常栈空作为一种控制转移的条件。
注意:(1)顺序栈中元素用向量存放(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置#include <stdio.h>#include 〈malloc。
h>typedef int SElemType;typedef int Status;#define INIT_SIZE 100#define STACKINCREMENT 10#define Ok 1#define Error 0#define True 1#define False 0typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;//初始化栈Status InitStack(SqStack *s){s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));if(!s->base){puts("存储空间分配失败!”);return Error;}s-〉top = s—>base;s->stacksize = INIT_SIZE;return Ok;}//清空栈Status ClearStack(SqStack *s){s-〉top = s—〉base;return Ok;}//栈是否为空Status StackEmpty(SqStack *s){if(s-〉top == s->base)return True;elsereturn False;}//销毁栈Status Destroy(SqStack *s)free(s->base);s—>base = NULL;s->top = NULL;s-〉stacksize=0;return Ok;}//获得栈顶元素Status GetTop(SqStack *s,SElemType &e){if(s—〉top == s—>base)return Error;e = *(s—〉top - 1);return Ok;}//压栈Status Push(SqStack *s,SElemType e){if(s—>top - s—〉base >= s->stacksize){s—〉base = (SElemType *)realloc(s->base,(s—〉stacksize + STACKINCREMENT) *sizeof(SElemType));if(!s—>base){puts("存储空间分配失败!");return Error;}s-〉top = s—>base + s—>stacksize;s->stacksize += STACKINCREMENT;}*s->top++ = e;return Ok;}//弹栈Status Pop(SqStack *s, SElemType *e){if(s—〉top == s—>base)return Error;-—s-〉top;*e = *(s—〉top);return Ok;}//遍历栈Status StackTraverse(SqStack *s,Status(*visit)(SElemType)) {SElemType *b = s—>base;SElemType *t = s—>top;while(t 〉b)visit(*b++);printf("\n");return Ok;}Status visit(SElemType c){printf("%d ",c);return Ok;}int main(){SqStack a;SqStack *s = &a;SElemType e;InitStack(s);int n;puts("请输入要进栈的个数:”);scanf("%d",&n);while(n—-){int m;scanf("%d", &m);Push(s, m);}StackTraverse(s,visit);puts("”);Pop(s,&e);printf(”%d\n”, e);printf("%d\n”, *s—>top);Destroy(s);return 0;}[实验2] 栈的链式表示和实现实验内容与要求:编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化链栈(2)链栈置空(3)入栈(4)出栈(5)取栈顶元素(6)遍历链栈分析:链栈是没有附加头结点的运算受限的单链表.栈顶指针就是链表的头指针。
实验2 栈和队列的操作

实验二栈和队列的操作一、实验目的1.熟悉栈和队列的存储结构;2.熟悉栈和队列的相关操作;3.利用栈和队列求解一些常见问题。
二、实验内容1、表达式求值任何一个算术表达式都是由操作数(operand) 、运算符(operator) 和界限符(edlimiter) 组成的。
为了简化问题.这里假设算术表达式中的操作数为单个数字表示的变量:运算符有加“ + ”、减“—”、乘“ * ”、除“/”和括号,表达式以“#”结束。
运算法则是括号优先级最高,先乘除,后加减,同级运算自左至右。
程序设计时需设置两个工作栈。
一个称为运算符栈,用OP 表示,用于存放表达式中的运算符:另一个称为操作数栈,用S 表示,用于存放操作数或运算结果。
这两个栈的初始状态均为空。
计算机从左至右扫描表达式,凡遇操作数一律进S 栈;若遇运算符,则要把它的优先数和栈顶运算符的优先数进行比较:若前者大,则该运算符进OP 栈;否则,栈顶运算符退栈、并进行计算,运算对象为S 栈顶上的两个元素,且先退栈的元素在运算量的右侧,后退栈的在运算量的左侧。
试编写一程序,先输入一个表达式,再求表达式的值。
2、数制转换假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。
从计算过程可见,这八进制的各个数位产生的顺序是从低位到高位的,而打印输出的顺序,一般来说应从高位到低位,这恰好和计算过程相反。
因此,需要先保存在计算过程中得到的八进制数的各位,然后逆序输出,因为它是按“后进先出”的规律进行的,所以用栈最合适。
试编写一个程序,实现将十进制数转换成八进制数并输出。
三、主要任务1、完成算法设计和程序设计,并分析算法时间复杂度和空间复杂度;2、写出程序运行情况,写出输入数据及运行结果;3、撰写实验报告,写出算法设计小结和心得。
四、思考题1、为什么说栈是一种特殊线性表?它的操作与线性表有什么不同?2、对于数制转换算法,如果不用栈如何实现?。
实验二(1)讲义-栈和队列的应用

实验2:栈和队列的应用
一、实验目的
1.掌握栈的表示与实现
2.掌握队列的表示与实现
3.掌握栈的入栈、出栈等基本操作
4.掌握队列的入队、出队等基本操作
二、实验内容
1.实现顺序栈各种基本运算的算法,具体操作要求如下:
(1)初始化栈,并判断栈是否为空;
(2)对a,b,c,d,f五个字符元素模拟进栈操作;并判断栈是否为空;
(3)取出栈顶元素;
(4)对a,b,c,d,f五个字符元素做依次出栈操作,并判断栈是否为空;
(5)释放栈。
具体效果如下:
注:若sqstack.cpp文件中的方法不合适,可以作修改。
2.实现链栈各种基本运算的算法
(1)初始化栈,并判断栈是否为空;
(2)对a,b,c,d,f五个字符元素模拟进栈操作;并判断栈是否为空;
(3)取出栈顶元素;
(4)对a,b,c,d,f五个字符元素做依次出栈操作,并判断栈是否为空;
(5)释放栈。
注:若listack.cpp文件中的方法不合适,可以作修改。
三、实验要求
1.独立完成实验程序的编写与调试;
2.实验完成后填写实验报告,学习委员按学号从小到大的顺序提交。
四、思考题
1.读入一个有限大小的整数n,然后按输入次序的相反次序输出各元素的值。
(用顺序栈
实现)
2.利用栈完成数制转换。
任意输入一个十进制数,将其转换成八进制数。
(用顺序栈实
现)。
栈与队列实验报告总结

栈与队列实验报告总结实验报告总结:栈与队列一、实验目的本次实验旨在深入理解栈(Stack)和队列(Queue)这两种基本的数据结构,并掌握其基本操作。
通过实验,我们希望提高自身的编程能力和对数据结构的认识。
二、实验内容1.栈的实现:我们首先使用Python语言实现了一个简单的栈。
栈是一种后进先出(LIFO)的数据结构,支持元素的插入和删除操作。
在本次实验中,我们实现了两个基本的栈操作:push(插入元素)和pop(删除元素)。
2.队列的实现:然后,我们实现了一个简单的队列。
队列是一种先进先出(FIFO)的数据结构,支持元素的插入和删除操作。
在本次实验中,我们实现了两个基本的队列操作:enqueue(在队尾插入元素)和dequeue(从队头删除元素)。
3.栈与队列的应用:最后,我们使用所实现的栈和队列来解决一些实际问题。
例如,我们使用栈来实现一个算术表达式的求值,使用队列来实现一个简单的文本行编辑器。
三、实验过程与问题解决在实现栈和队列的过程中,我们遇到了一些问题。
例如,在实现栈的过程中,我们遇到了一个“空栈”的错误。
经过仔细检查,我们发现是因为在创建栈的过程中没有正确初始化栈的元素列表。
通过添加一个简单的初始化函数,我们解决了这个问题。
在实现队列的过程中,我们遇到了一个“队列溢出”的问题。
这是因为在实现队列时,我们没有考虑到队列的容量限制。
通过添加一个检查队列长度的条件语句,我们避免了这个问题。
四、实验总结与反思通过本次实验,我们对栈和队列这两种基本的数据结构有了更深入的理解。
我们掌握了如何使用Python语言实现这两种数据结构,并了解了它们的基本操作和实际应用。
在实现栈和队列的过程中,我们也学到了很多关于编程的技巧和方法。
例如,如何调试代码、如何设计数据结构、如何优化算法等。
这些技巧和方法将对我们今后的学习和工作产生积极的影响。
然而,在实验过程中我们也发现了一些不足之处。
例如,在实现栈和队列时,我们没有考虑到异常处理和性能优化等方面的问题。
实验报告——栈和队列的应用

实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验5 栈和队列的应用目的和要求:(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。
一、题目题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。
所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。
例如,a+b&b+a等等。
题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题,并实现。
题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。
请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。
题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。
试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
题目5.利用循环链队列求解约瑟夫环问题。
请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。
选择题目3:打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
二、程序清单//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现{ LinkNode*p;while(front!=NULL)//逐个删除队列中的结点{p=front;front=front->link;delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数if(front==NULL){//判断是否为空front=rear=new LinkNode;//如果为空,新结点为对头也为对尾front->data=rear->data=x;if(front==NULL)//分配结点失败return false;} else{rear->link=new LinkNode;//如不为空,在链尾加新的结点rear->link->data=x;if(rear->link==NULL)return false;rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空{return false;} cout<data<LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改delete p;//释放原结点return true;};void main()//主函数 { LinkedQueue q;//定义类对象char flag='Y';//标志是否输入了命令const int max=30;//一次获取输入命令的最大个数while(flag=='Y')//循环{ int i=0;char str[max];//定义存储屏幕输入的命令的数组gets(str);//获取屏幕输入的命令while(str[i]!=''){q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中i++;}for(int j=0;j<=i;j++){if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令{cout<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈、队列的实现及应用实验课程名:数据结构与算法专业班级:学号:姓名:实验时间:实验地点:指导教师:冯珊一、实验目的1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。
2、掌握栈和队列的特点,即先进后出与先进先出的原则。
3、掌握栈和队列的基本操作实现方法。
二、实验内容一、实验目的及要求1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际背景下灵活运用。
2、掌握栈和队列的特点,即先进后出与先进先出的原则。
3、掌握栈和队列的基本操作实现方法。
二、实验学时2学时三、实验任务任务一:(1)实现栈的顺序存储(2)实现栈的链式存储。
任务二:实现顺序存储的循环队列,完成键盘缓冲区的功能。
四、实验重点、难点1.进栈、出栈栈顶指针都要改变。
2.队空、队满的条件及入队、出队时指针的变更。
五、操作内容与要求1.任务一(1):完成下列程序,该程序实现栈的顺序存储结构,构建顺序栈(栈中的元素依次为R,S,Y,F,C,T),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。
要求生成顺序栈时,从键盘上读取数据元素。
(1)源代码:#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10# define OK 1# define ERROR 0typedef char SElemType;/* 顺序栈的存储类型 */typedef struct//define structure SqStack(){SElemType *base;SElemType *top;int stacksize;}SqStack;/*构造空顺序栈*/int InitStack(SqStack *S) //InitStack() sub-function{S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if (!S->base){printf("分配空间失败!\n");return (ERROR);}S->top = S->base;S->stacksize = STACK_INIT_SIZE;printf("栈初始化成功!\n");return (OK);} //InitStack() end/*取顺序栈顶元素*/int GetTop(SqStack *S, SElemType *e) //GetTop() sub-function{if (S->top == S->base){printf("栈为空!\n"); //if empty SqStackreturn (ERROR);}*e = *(S->top - 1);return (OK);} //GetTop() end/*将元素压入顺序栈*/int Push(SqStack *S) //Push() sub-function{SElemType e;if (S->top - S->base>S->stacksize){S->base = (SElemType *)realloc(S->base, (S->stacksize +STACKINCREMENT*sizeof(SElemType)));if (!S->base){printf("存储空间分配失败!\n");return (ERROR);}S->top = S->base + S->stacksize;S->stacksize += STACKINCREMENT;}fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量xprintf("请输入要入栈的元素的值:");e = getchar();*S->top++ = e;return (OK);} //Push() end/* 将元素弹出顺序栈*/int Pop(SqStack *S, SElemType *e) //Pop() sub-function {if (S->top == S->base){printf("栈为空!\n");return (ERROR);}*e = *--S->top;return (OK);} //Pop() endvoid display(SqStack *s){if (s->top == s->base)printf("栈为空!\n");else{while (s->top != s->base){s->top = s->top - 1;printf("%c->", *(s->top));}}printf("\n");}int main(){int choice;SElemType e;SqStack s;do{printf("===============================\n");printf(" 0:退出\n");printf(" 1:初始化栈\n");printf(" 2:入栈\n");printf(" 3:出栈\n");printf(" 4:读取栈顶元素\n");printf(" 5:显示栈中元素\n");printf("===============================\n");printf("输入操作选择代码(0-5):");scanf("%d", &choice);while(choice<0 || choice>5) { printf("输入有误,请重新输入(0-5):"); scanf("%d", &choice); }switch (choice){case 0:exit(1);case 1:InitStack(&s); break;case 2:printf("2\n"); Push(&s); break;case 3:Pop(&s, &e); printf("出栈元素的值是:%c\n", e); break;case 4:GetTop(&s, &e); printf("栈顶元素的值是:%c\n", e); break;case 5: printf("栈中元素的值是为:\n"); display(&s); break;}} while (choice);return 0;}(2)运行结果(3)结果分析顺序表通过设置栈顶运用线性结构实现先进先出功能。
2.任务一(2):完成下列程序,该程序实现栈的链式存储结构,构建链栈(栈中的元素依次为China,Japan,France,India,Australia),依次进行进栈和出栈操作,判断栈空和栈满操作,返回栈顶元素操作。
要求生成链栈时,从键盘上读取数据元素。
(1)源代码:#include<stdio.h>#include<stdlib.h>#include<string.h># define OK 1# define ERROR 0typedef char DataType;/* 链式栈的存储类型 */typedef struct SNode //define structure LinkStack{ DataType data[20];struct SNode *next;}SNode,*LinkStack;void InitStack_L (LinkStack *top){top = (LinkStack)malloc(sizeof(SNode)) ;top->next = NULL;printf("\n\n栈初始化成功!\n\n");}/*取链式栈顶元素*/int GetTop_L(LinkStack *top,DataType e[]) //GetTop_L() sub-function { if(!top->next){ printf("链栈为空!\n");return (ERROR);}else{ strcpy(e,top->next->data);return (OK);}} //GetTop_L() end/* 将元素压入链式栈*/int Push_L(LinkStack *top) //Push_L() sub-function{ SNode *q;DataType e[20];q=(LinkStack)malloc(sizeof(SNode));if(!q){ printf("存储空间分配失败! \n");return (ERROR);}fflush(stdin);//清除输入缓冲区,否则原来的输入会默认送给变量e printf("\n请输入要入栈的元素的值:");gets(e);strcpy(q->data,e);q->next=top->next;top->next=q;return (OK);} //Push_L() end/*将元素弹出链式栈*/int Pop_L(LinkStack *top,DataType e[]) //Pop_L() sub-function{ SNode *q;if(!top->next){ printf("链栈为空! \n ");return (ERROR);}strcpy(e,top->next->data);q=top->next;top->next=q->next;free(q);return (OK);} //Pop_L() endvoid display(LinkStack *top){LinkStack p=top->next;if(!p)printf("栈为空!\n");else{while(p){printf("%s->",p->data);p=p->next;}}printf("^\n");}int main(){char choice;DataType e[20]="";LinkStack s=NULL;do{printf("===============================\n"); printf(" 0:退出\n");printf(" 1:初始化栈\n");printf(" 2:入栈\n");printf(" 3:出栈\n");printf(" 4:读取栈顶元素\n");printf(" 5:显示栈中元素\n");printf("===============================\n"); printf("输入操作选择代码(0-5):");fflush(stdin);scanf("%c",&choice);while(choice<'0'||choice>'5'){printf("输入有误,请重新输入(0-5):");fflush(stdin);scanf("%c",&choice);}switch(choice){case '0':exit(1);case '1': InitStack_L(&s);break;case '2': Push_L(&s);break;case '3':Pop_L(&s, e);break;case '4':GetTop_L(&s, e);printf("栈顶元素的值是:%s\n",e);break; case '5': printf("栈中元素的值是: ");display(&s);}}while(choice);return 0;}(2)运行结果(3)结果分析链表通过设置栈顶运用指针实现先进先出功能3.任务二:完成下列程序,该程序实现循环队列的存储和基本操作,构建循环队列,完成键盘缓冲区的功能,每输入一个字符,链入缓冲区队列中;每输出一个字符,将该字符从缓冲区中删除。