实验二栈和队列
实验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.利用栈完成数制转换。
任意输入一个十进制数,将其转换成八进制数。
(用顺序栈实
现)。
实验二栈和队列

需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。
[选作内容]
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
实验条件:
实验内容:
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
*6.综合训练:1)利用栈实现表达式求值算法。
洛阳理工学院实验报告
系别
班级
学号
姓名
课程名称
实验日期
实验名称
实验二、栈和队列的应用
成绩
实验目的:
1、掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。
2、掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,队列顺序存储结构、链式存储结构和循环队列的实现,以便在实际问题背景下灵。
(3)汽车可以直接从便道上开走,此时派在它前面的汽车要先开走让路,然后再依次排到队尾。
(4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。
实验总结:
[测试数据]
设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。
实验二 栈和队列

实验二栈和队列本文档旨在介绍实验二的目的和背景,以及本实验的重要性。
实验二主要涉及栈和队列的相关概念和操作。
栈和队列是常用的数据结构,它们在计算机科学和软件开发中起着重要的作用。
栈是一种先进后出(Last In First Out,LIFO)的数据结构,类似于我们平常堆放书籍的行为。
队列是一种先进先出(First In First Out,FIFO)的数据结构,类似于排队等待的情景。
通过本实验,我们将研究如何使用栈和队列来解决各种问题。
掌握栈和队列的基本原理和操作,对于提高程序的效率和优化算法都具有重要意义。
同时,栈和队列的概念也是许多其他数据结构和算法的基础,理解栈和队列将有助于我们更深入地研究和应用其他数据结构和算法。
本实验将引导我们通过实际的编程练来加深对栈和队列的理解和应用。
我们将实现栈和队列的基本操作,例如入栈、出栈、入队、出队等,并通过一系列的例子和问题来巩固对这些概念的理解。
通过完成本实验,我们将掌握栈和队列的基本概念和操作,加深对其应用场景的理解和掌握,并培养解决问题的逻辑思维能力和编程实践能力。
让我们开始实验二的研究,进一步探索栈和队列的奥秘吧!本实验的目标是研究和理解栈和队列数据结构的基本概念和操作。
本实验主要涉及栈和队列的定义、基本操作及其应用。
栈的定义栈是一种具有后进先出(Last-In-First-Out,简称LIFO)特性的线性数据结构。
栈只允许在表尾(称为栈顶)进行插入和删除操作,且最后插入的元素最先删除。
栈的基本操作栈的基本操作包括:Push:将元素插入到栈顶。
Pop:删除栈顶的元素,并返回被删除的元素。
IsEmpty:判断栈是否为空。
Top:返回栈顶的元素,但不删除栈顶元素。
栈的应用栈在计算机科学中有广泛的应用,包括但不限于:函数调用(函数调用时的局部变量保存在栈中)。
表达式求值(后缀表达式计算等)。
浏览器的页面回退功能。
队列的定义队列是一种具有先进先出(First-In-First-Out,简称FIFO)特性的线性数据结构。
栈和队列基本操作实验报告

栈和队列基本操作实验报告实验二堆栈和队列基本操作的编程实现【实验目的】堆栈和队列基本操作的编程实现要求:堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。
也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】验证性实验(学时数:2H)【实验内容】内容:把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。
可以实验一的结果自己实现数据输入、数据显示的函数。
利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。
【实验分析、说明过程】分析:进栈操作先创建一个以x为值的新结点p,其data域值为x则进栈操作步骤如下: 将新结点p的指针域指向原栈顶S(执行语句p->next=S)。
将栈顶S指向新结点p(执行语句S=p)。
注:进栈操作的?与?语句执行顺序不能颠倒,否则原S指针其后的链表将丢失。
出栈操作先将结点栈顶S数据域中的值赋给指针变量*x,则删除操作步骤如下: 结点p 指针域指向原栈顶S(执行语句p=S)。
栈顶S指向其的下一个结点(执行语句S=S->next)释放p结点空间(执行语句free(p))。
队列分析:用链式存储结构实现的队列称为链队列,一个链队列需要一个队头指针和一个队尾指针才能唯一确定。
队列中元素的结构和前面单链表中的结点的结构一样。
为了操作方便,在队头元素前附加一个头结点,队头指针就指向头结点。
【思考问题】1. 栈的顺序存储和链表存储的差异,答:栈的顺序存储有‘后进先出’的特点,最后进栈的元素必须最先出来,进出栈是有序的,在对编某些需要按顺序操作的程序有很大的作用。
链表存储:通过链表的存储可以实现链表中任意位置的插入元素,删除任意元素,可以实现无序进出。
2. 还会有数据移动吗,为什么,答:栈的顺序存储不会有数据移动,移动的只是指向该数据地址的指针。
天大数据结构_实验作业二_栈(顺序栈)+队列(循环队列)

实验作业二:栈(顺序栈)和队列(循环队列)1. 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。
当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。
两个栈均从两端向中间增长。
当向第0号栈插入一个新元素时,使top[0]增1得到新的栈顶位置,当向第1号栈插入一个新元素时,使top[1]减1得到新的栈顶位置。
当top[0]+1 == top[1]时或top[0] == top[1]-1时,栈空间满,此时不能再向任一栈加入新的元素。
试定义这种双栈(Double Stack)结构的类定义,并实现判栈空、判栈满、插入、删除算法。
2. 求fibonacci数列算法,并比较。
(递归+非递归)(非递归方法可查阅其他资料)编写实习报告要求:一、需求分析二、概要设计1.抽象数据类型2.算法三、详细设计程序代码(注释)四、调试分析调试过程中所做的工作,时间复杂度等五、测试结果输入数据和输出数据示例六、说明(如果有)编程语言:C语言或C++语言实习报告提交方式:下次上机前,将实习报告(.doc)和源程序(.cpp)压缩成一个rar 文件,文件名称为学号_班级_姓名_第几次作业。
例如:3010216155_六班_张三_第二次作业.rar。
实习报告作为本课程的平时成绩。
抄袭、雷同,双方均为0分。
第一题:一、需求分析程序要求建立一个共享栈,分配一个存储空间,两个栈分别位于两头。
并实现对两个栈的插入,删除,和判断栈满和栈空。
栈的位置不同,所以要求对不同栈的插入和删除采用不同的算法。
二、概要设计1.抽象数据类型typedef struct {int *base;int *top;int stacksize;}stack;2.算法1.建立栈。
int instack(stack &s,stack &w,int length){s.base=(int *)malloc(length*sizeof(length));w.base=s.base+length;if(!s.base||!w.base) return 0;else{s.top=s.base;w.top=w.base;s.stacksize=length;w.stacksize=length;}return 1;}2.判断栈空。
栈和队列的基本操作实验报告
《数据结构》实验报告一软件132201300514211徐蜀实验二栈和队列的基本操作及其应用一、实验目的1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。
2、掌握栈和队列的特点,即后进先出和先进先出的原则。
3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。
二、实验内容1.回文判断三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(函数)的伪码算法、函数实现、程序编码、调试与分析。
附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、栈的初始长度与需要再增加的长度#define STACK_INIT_SIZE 100;#define STACKINCREMENT 10;typedef char SElemType;//定义SElemType为char型2、栈的顺序存储表示typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;3、队列的链式表示方法typedef struct QNode {SElemType data;struct QNode *next; } QNode, *QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;4、初始化栈/* 函数功能:对栈进行初始化参数:栈(SqStack &S)成功返回1,否则返回0 */int InitStack(SqStack &S){S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));//申请内存if(!S.base) //判断有无申请到空间return ERROR; //没有申请到内存,返回0S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}5、入栈操作/* 函数功能:将元素入栈参数:栈(SqStack &S),插入元素e插入成功返回1,否则返回0 */int 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) //判断是否申请成功return ERROR; //不成功返回0S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}6、出栈操作/* 函数功能:将栈中的元素弹出参数:栈(SqStack &S),记录元素e */int Pop(SqStack &S, SElemType &e){if(S.top == S.base) //判断栈是否为空return ERROR;e = *(--S.top) ;return OK;}7、初始化队列/* 函数功能:初始化队列参数:队列(LinkQueue &Q)成功返回1,否则返回0 */int InitQueue(LinkQueue &Q){Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//申请结点的内存if(!Q.front) //判断有无申请到空间return ERROR; //没有返回0Q.front ->next = NULL;return OK;}8.在队列队尾插入元素/* 函数功能:在队列队尾插入元素参数:队列(LinkQueue &Q),插入元素e成功返回1,否则返回0 */ int EnQueue(LinkQueue &Q, QElemType e){p = (QueuePtr)malloc(sizeof(QNode)); //申请新的结点if(!p)return ERROR;p -> data = e;p -> next = NULL;Q.rear -> next = P;Q.rear = p;return OK;}9.删除队头元素/* 函数功能:删除对头元素参数:队列(LinkQueue &Q),记录值e成功返回1,否则返回0 */ int DeQueue(LinkQueue &Q, QElemType &e){if(Q.front == Q.rear) //判断队列是否为空return ERROR;p = Q.front -> next;e = p -> data;Q.front -> next = p -> next;if(Q.rear == p)Q.rear = Q.front;free(p);return OK;}10、主函数int main(){SqStack S; //声明一个栈LinkQueue Q; //声明一个队列char m,k,c;int n=0,i,j,t=0,z=0;while(!t){cout << "请输入你要判断回文的字符串,输入@结束:";InitQueue (Q);InitStack (S);while((c=getchar())!='@')//对字符的判断不断输入字符{EnQueue (Q,c);Push (S,c);n++;}for( j=1;j<=n;j++){OutQueue (Q,m);Pop (S,k);if(m!=k)break;}if(j>n) //如果j > n则说明全部相等cout << "这个字符串不是回文字符串" << endl;elsecout << "这个字符串是回文字符串" << endl;}return 0;}说明:通过调用序列号不同的函数进行各种操作。
数据结构实验二
数据结构实验二数据结构实验二:队列与栈的实现一、实验目的本实验旨在通过实现队列和栈数据结构,加深对队列和栈实现原理的理解,并熟练掌握队列和栈的基本操作。
二、实验要求1.使用C/C++语言实现队列的基本操作:初始化队列、入队、出队、判空、判满等。
2.使用C/C++语言实现栈的基本操作:初始化栈、入栈、出栈、判空、判满等。
3.验证队列和栈的实现是否正确。
4.分析队列和栈的时间复杂度,并给出实验结果。
5.撰写实验报告,包括实验目的、实验原理、实验步骤、程序源代码、实验结果和分析、实验总结等内容。
三、实验原理1.队列:队列是一种先进先出(FIF0)的数据结构。
在队列中,数据元素按照进入队列的顺序排列,首元素是最先进入的元素,尾元素是最后进入的元素。
队列的基本操作有:初始化队列、入队、出队、判空、判满等。
2.栈:栈是一种后进先出(LIFO)的数据结构。
在栈中,数据元素按照进入栈的顺序排列,但是只能从栈顶进出,即最后进入的元素最先出栈。
栈的基本操作有:初始化栈、入栈、出栈、判空、判满等。
四、实验步骤1.实现队列的基本操作:1.初始化队列:创建一个空队列,并设置相关指针。
2.入队:将新元素插入到队尾。
3.出队:将队头元素删除,并返回其值。
4.判空:判断队列是否为空。
5.判满:判断队列是否已满。
2.实现栈的基本操作:1.初始化栈:创建一个空栈,并设置相关指针。
2.入栈:将新元素压入栈顶。
3.出栈:将栈顶元素弹出,并返回其值。
4.判空:判断栈是否为空。
5.判满:判断栈是否已满。
3.编写测试代码,验证队列和栈的基本操作是否正确。
4.进行性能测试,分析队列和栈的时间复杂度。
五、实验结果与分析1.队列的时间复杂度:●初始化队列:O(1)●入队:O(1)●出队:O(1)●判空:O(1)●判满:O(1)2.栈的时间复杂度:●初始化栈:O(1)●入栈:O(1)●出栈:O(1)●判空:O(1)●判满:O(1)3.根据实验结果可以看出,队列和栈的基本操作的时间复杂度都是O(1),即常数时间复杂度,具有高效性。
数据结构_堆栈和队列实验报告
实验报告实验二堆栈和队列实验目的:1.熟悉栈这种特殊线性结构的特性;2.熟练并掌握栈在顺序存储结构和链表存储结构下的基本运算;3.熟悉队列这种特殊线性结构的特性;3.熟练掌握队列在链表存储结构下的基本运算。
实验原理:堆栈顺序存储结构下的基本算法;堆栈链式存储结构下的基本算法;队列顺序存储结构下的基本算法;队列链式存储结构下的基本算法;实验容:3-18 链式堆栈设计。
要求(1)用链式堆栈设计实现堆栈,堆栈的操作集合要求包括:初始化StackInitiate(S),非空否StackNotEmpty(S),入栈StackiPush(S,x),出栈StackPop(S,d),取栈顶数据元素StackTop(S,d); (2)设计一个主函数对链式堆栈进行测试。
测试方法为:依次把数据元素1,2,3,4,5入栈,然后出栈并在屏幕上显示出栈的数据元素;(3)定义数据元素的数据类型为如下形式的结构体,Typedef struct{char taskName[10];int taskNo;}DataType;首先设计一个包含5个数据元素的测试数据,然后设计一个主函数对链式堆栈进行测试,测试方法为:依次吧5个数据元素入栈,然后出栈并在屏幕上显示出栈的数据元素。
3-19 对顺序循环队列,常规的设计方法是使用対尾指针和对头指针,对尾指针用于指示当前的対尾位置下标,对头指针用于指示当前的対头位置下标。
现要求:(1)设计一个使用对头指针和计数器的顺序循环队列抽象数据类型,其中操作包括:初始化,入队列,出队列,取对头元素和判断队列是否为空;(2)编写一个主函数进行测试。
实验结果:3-18typedef struct snode{DataType data;struct snode *next;} LSNode;/*初始化操作:*/void StackInitiate(LSNode **head)/*初始化带头结点链式堆栈*/{if((*head = (LSNode *)malloc(sizeof(LSNode))) == NULL) exit(1);(*head)->next = NULL;}/*判非空操作:*/int StackNotEmpty(LSNode *head)/*判堆栈是否非空,非空返回1;空返回0*/{if(head->next == NULL) return 0;else return 1;}/*入栈操作:*/int StackPush(LSNode *head, DataType x)/*把数据元素x插入链式堆栈head的栈顶作为新的栈顶*/{LSNode *p;if((p = (LSNode *)malloc(sizeof(LSNode))) == NULL){printf("存空间不足无法插入! \n");return 0;}p->data = x;p->next = head->next; /*新结点链入栈顶*/head->next = p; /*新结点成为新的栈顶*/ return 1;}/*出栈操作:*/int StackPop(LSNode *head, DataType *d)/*出栈并把栈顶元素由参数d带回*/{LSNode *p = head->next;if(p == NULL){printf("堆栈已空出错!");return 0;}head->next = p->next; /*删除原栈顶结点*/*d = p->data; /*原栈顶结点元素赋予d*/ free(p); /*释放原栈顶结点存空间*/ return 1;}/*取栈顶数据元素操作:*/int StackTop(LSNode *head, DataType *d)/*取栈顶元素并把栈顶元素由参数d带回*/{LSNode *p = head->next;if(p == NULL){printf("堆栈已空出错!");return 0;}*d = p->data;return 1;}/*撤销*/void Destroy(LSNode *head){LSNode *p, *p1;p = head;while(p != NULL){p1 = p;p = p->next;free(p1);}}(2)主函数程序:#include<stdio.h>#include<stdlib.h>typedef int DataType;#include "LinStack.h"void main(void){ LSNode *myStack;int i, x;StackInitiate(&myStack);for(i=0;i<5; i++){ if(StackPush(myStack,i+1)==0){printf("error!\n");return;}}if(StackTop(myStack, &x)==0){printf("error!\n");return;}elseprintf("The element of local top is :%d\n",x);printf( "The sequence of outing elements is:\n");while(StackNotEmpty(myStack)){StackPop(myStack, &x);printf("%d ", x);}printf("\n");Destroy(myStack);printf("This program is made by10273206\n"); }运行结果为:(3)设计结构体和测试函数如下:#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct{char taskName[10];int taskNo;}DataType;#include"LinStack.h"void main(){LSNode *myStack;FILE *fp;DataType task,x;if((fp=fopen("task.txt","r"))==NULL){printf("不能打开文件task.txt!\n");exit(0);}StackInitiate(&myStack);while(!feof(fp)){fscanf(fp,"%s %d",&task.taskName,&task.taskNo);StackPush(myStack,task);}fclose(fp);while(StackNotEmpty(myStack)){StackPop(myStack,&x);printf("%s %d\n",x.taskName,x.taskNo);}Destroy(myStack);printf("This program is made by 10273206\n");}运行结果为:3-19(1)typedef struct{DataType queue[MaxQueueSize];int front; /*队头指针*/int count; /*计数器*/} SeqCQueue;/*初始化操作:QueueInitiate(SeqCQueue *Q) */void QueueInitiate(SeqCQueue *Q)/*初始化顺序循环队列Q */{Q->front=0; /*定义初始队头指针下标*/Q->count=0; /*定义初始计数器值*/}/*判非空否操作:QueueNotEmpty(SeqCQueue Q)*/ int QueueNotEmpty(SeqCQueue Q)/*判断顺序循环队列Q非空否,非空时返回1,否则返回0 */{if(Q.count!=0)return 1;else return 0;}/*入队列操作:QueueAppend(SeqCQueue *Q, DataType x)*/int QueueAppend(SeqCQueue *Q, DataType x)/*把数据元素x插入顺序循环队列Q的队尾,成功时返回1,否则返回0 */ {if(Q->count==MaxQueueSize){printf("The queue is full!\n");return 0;}else{ int r;r=Q->front+Q->count;Q->queue[r]=x;Q->count++;return 1;}}/*出队列操作:QueueDelete(SeqCQueue *Q, DataType *d)*/int QueueDelete(SeqCQueue *Q, DataType *d)/*删除顺序循环队列队头数据元素并赋值d,成功时返回1,否则返回0 */ {if(Q->count==0){printf("The queue is empty!\n");return 0;}else{*d=Q->queue[Q->front];Q->front=(Q->front+1)%MaxQueueSize;Q->count--;return 1;}}/*取对头数据元素操作:QueueGet(SeqCQueue Q, DataType *d)*/int QueueGet(SeqCQueue Q, DataType *d)/* 取顺序循环队列队头数据元素并赋值d,成功时返回1,否则返回0 */ {if(Q.count==0){printf("The queue is empty!\n");return 0;}else{*d=Q.queue[Q.front];return 1;}}(2)主函数程序:#include<stdio.h>#define MaxQueueSize 100typedef int DataType;#include"SeqQueue.h"void main(void){int i,j,d;SeqCQueue myQueue;QueueInitiate(&myQueue);if(QueueNotEmpty(myQueue)==0)printf("队列为空!请输入数据元素:\n"); /*判空*/for(i=0;i<=10;i++){if(QueueAppend(&myQueue,i+1)==0)break;}printf("元素个数为%d\n",myQueue.count); /*输出元素个数*/for(j=0;j<=9;j++){if(QueueDelete(&myQueue,&d)==0)break;printf("%d ",d); /*出队列并显示元素*/ }printf("\n");if(QueueNotEmpty(myQueue)==1)printf("队列不为空\n"); /*再次判空*/printf("This program is made by 10273206\n");}运行结果为:总结与思考对于堆栈和队列实验的操作,我明白了栈和队列这两种特殊线性结构的特性,初步掌握了栈在顺序存储结构和链表存储结构下的基本运算。
数据结构实验2——栈和队列实验报告
数据结构实验报告实验名称:实验2——栈和队列1 实验目的通过选择下面五个题目之一进行实现,掌握如下内容:进一步掌握指针、模板类、异常处理的使用掌握栈的操作的实现方法掌握队列的操作的实现方法学习使用栈解决实际问题的能力学习使用队列解决实际问题的能力2 实验内容利用栈结构实现八皇后问题。
八皇后问题19世纪著名的数学家高斯于1850年提出的。
他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。
请设计算法打印所有可能的摆放方法。
提示:1、可以使用递归或非递归两种方法实现2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析主程序:#include<iostream>using namespace std;const int StackSize=8; //皇后的个数int num=0;template <class T>class SeqStack //定义顺序栈模板类{public:SeqStack(){top=-1;} //构造函数,初始化空栈void Push(T x); //入栈操作void Pop();//出栈操作void PlaceQueen(int row); //放置皇后bool Judgement();//判断是否符合条件void Print();//输出符合条件的皇后排列bool Empty(){if(top==-1) return true;else return false;}; //判断栈是否为空private:T data[StackSize]; //定义数组int top; //栈顶指针};template <class T>void SeqStack<T>::Push(T x) //入栈操作{if(top>=StackSize-1) throw"上溢";top++;//栈顶指针上移data[top]=x;}template <class T>void SeqStack<T>::Pop()//出栈操作{if(Empty()) throw"下溢";top--;//栈顶指针下移}template <class T>bool SeqStack<T>::Judgement()//判断该位置是否合适{for(int i=0;i<top;i++)if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))//判断是否满足任意两个皇后不在同列同一斜线return false;return true;}template <class T>void SeqStack<T>::PlaceQueen(int row) //放置皇后{for (int i=0;i<StackSize;i++){Push(i); //入栈if (Judgement())//判断位置是否合适{if (row<StackSize-1)PlaceQueen(row+1); //如果合适满足条件则放置一个皇后,递归调用else{num++;//不满足条件则到下一行Print();//输出符合条件的皇后}}Pop();//出栈}}template <class T>void SeqStack<T>::Print()//输出皇后函数{cout<<"NO."<<num<<":"<<endl; for(int i=0;i<StackSize;i++){for(int j=0;j<data[i];j++){cout<<"□";}cout<<"■";for(int j=StackSize-1;j>data[i];j--){cout<<"□";}cout<<endl;}cout<<endl;}void main(){SeqStack<int> Queen;Queen.PlaceQueen(0);cout<<"总共有"<<num<<"种摆放方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈和队列1、实验目的:(1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。
2、实验要求:(1)复习课本中有关栈和队列的知识;(2)用 C 语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。
3、实验内容[ 实验1] 栈的顺序表示和实现实验内容与要求: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称为顺序栈, 它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,一种控制转移的条件。
(1)顺序栈中元素用向量存放(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量针)来指示当前栈顶位置#include <> #include <> 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 p->top= =MAXNUM-,1 栈满时,否则产生错误。
通常栈空作为top (通常称top 为栈顶指{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)遍历链栈分析:链栈是没有附加头结点的运算受限的单链表。
栈顶指针就是链表的头指针。
(1)LinkStack 结构类型的定义可以方便地在函数体中修改top 指针本身(2)若要记录栈中元素个数,可将元素个数属性放在LinkStack 类型中定义。
(3)链栈中的结点是动态分配的,所以可以不考虑上溢。
#include <>#include <> #define ERROR 0#define OK 1#define TRUE 1#define FALSE 0 typedef int ElemType;typedef int Status;typedef struct node{ElemType data; struct node *next;}StackNode;typedef struct{StackNode *top;}LinkStack;// 初始化void InitStack(LinkStack *s){s->top = NULL;puts(" 链栈初始化完成!");// 将链栈置空Status SetEmpty(LinkStack *s){StackNode *p = s->top;while(p){s->top = p->next;free(p);p = s->top;}puts(" 链栈已置空!");return OK;}}// 压栈Status Push(LinkStack *s, ElemType e){StackNode *p;p = (StackNode *)malloc(sizeof(StackNode)); p->data = e;p->next = s->top;s->top = p;return OK;}// 弹栈Status Pop(LinkStack *s, ElemType &e){StackNode *p = s->top;if(s->top == NULL){puts(" 栈空, 不能进行弹栈操作!"); return ERROR;}s->top = p->next;e = p->data;free(p);return OK;}// 打印栈Status PrintStack(LinkStack *s){StackNode *p;p = s->top;while(p){printf("%d ", p->data); p = p->next;}puts("");return OK;}int main(){LinkStack s;InitStack(&s);int n;printf(" 请输入链栈长度:\n");scanf("%d", &n);puts(" 请输入要录入的数据:");while(n--){int x;scanf("%d", &x);Push(&s, x);}PrintStack(&s);SetEmpty(&s);return 0;}?[ 实验3] 队列的顺序表示和实现实验内容与要求编写一个程序实现顺序队列的各种基本运算,并在此基础上设计一个主程完成如下功能:序,(1)初始化队列(2)建立顺序队列(3)入队(4)出队(5)判断队列是否为空(6)取队头元素(7)遍历队列分析:队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。
入队时,将新元素插入rear 所指的位置,然后将rear 加1。
出队时,删去front 所指的元素,然后将front 加 1 并返回被删元素。
顺序队列中的溢出现象:(1)" 下溢" 现象。
当队列为空时,做出队运算产生的溢出现象。
“下溢”是正常现象,常用作程序控制转移的条件。