实验二 栈与队列操作实验题目
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈与队列操作
实验目的:
(1)理解栈与队列的结构特征和运算特征,以便在实际问题背景下灵活运用。
(2)了解复杂问题的递归算法设计。
本次实验中,下列实验项目选做一。
1、顺序栈的基本操作
[问题描述]
设计算法,实现顺序栈的各种基本操作
[基本要求]
(1)初始化栈s。
(2)从键盘输入10个字符以$结束,建立顺序栈。
(3)从键盘输入1个元素,执行入栈操作。
(4)将栈顶元素出栈。
(5)判断栈是否为空。
(6)输出从栈顶到栈底元素。
要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
2、链栈的基本操作
[问题描述]
设计算法,实现链栈的各种基本操作
[基本要求]
(1)初始化栈s。
(2)从键盘输入10个字符以$结束,建立带头结点的链栈。
(3)从键盘输入1个元素,执行入栈操作。
(4)完成出栈操作。
(5)判断栈是否为空。
(6)输出从栈顶到栈底元素。
(7)输出链栈的长度。
要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
3、循环队列的基本操作
[问题描述]
设计算法,实现循环顺序队列的建立、入队、出队等操作。
[基本要求]
(1)从键盘输入10个字符以$结束,建立循环队列,并显示结果。
(2)从键盘输入1个元素,执行入队操作,并显示结果。
(3)将队头元素出队,并显示结果。
(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
4、只用尾指针表示的循环链表队列的综合操作
[问题描述]
假设以带头结点的的循环链表表示队列,并且只设一个指针指向队尾元素的结点(注意不设头指针),试编写队列初始化、入队、出队函数。
[基本要求及提示]
(1)首先定义链表结点类型。
(2)编写带头结点的循环链表的初始化函数,只用尾指针表示。
(3)编写入队函数、出队函数。
(4)在主函数中编写菜单(1.初始化;2.入队;3.出队;4.退出),调用上述功能函数。
5、用标志域表示队空队满状态的循环队列的综合操作
[问题描述]
要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。
[基本要求及提示]
(1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front==Q->rear,满:(Q->rear+1)%MAXSIZE==Q->front。
(2)本题不损失一个空间全部都得到利用,为此如下定义循环队列类型:
Typedef struct
{ QueueElementType element[MAXSIZE];
int front;
int rear;
int tag;
}SeqQueue;
此时,循环队列空和满的条件分别为: Q->front==Q->rear&&tag==0 和
Q->front==Q->rear&&tag==1
(3)编写入队函数、出队函数。
(4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。
6、利用辅助数组进行栈的逆置
[问题描述]
利用辅助栈将栈中的元素逆置。
[基本要求及提示]
在主函数中编写菜单(1.入栈;2.出栈;3.逆置;4.退出)调试运行程序。
7、利用辅助栈进行队列的逆置
[问题描述]
利用辅助栈进行队列元素逆置。
[基本要求及提示]
在主函数中编写菜单(1.入队;2.出队;3.逆置;4.退出)调试运行程序。
8、Hanoi塔问题
[问题描述]
现在有三根相邻的柱子,标号为A,B,C。A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动。
[基本要求及提示]
Hanoi塔问题。(要求4个盘子移动,输出中间结果)
9、数制转换问题
[问题描述]
将十进制数N转换为d进制数。
[基本要求及提示]
对于键盘输入的任意一个非负的十进制整数,打印输出与其等值的八进制数。
算法提示:
十进制数N转换为d进制数,基于如下原理:即除d取余法。例如:(1348)10=(2504)8
N N div 8 N mod 8
1348 168 4
168 21 0
21 2 5
2 0 2
由于上述的计算过程是从低位到高位顺序产生的八进制数的各个数位。而打印输出时,应从高位到低位进行,恰好和计算过程相反。因此可以先将计算过程中得到的八进制数的各个位进栈,待相对应的八进制数的各位均产生以后,再使其按顺序出栈,并打印输出。即得到了与输入的十进制数相对应的八进制数。
10、回文判断
[问题描述及提示]
编写程序,判断依次读入的一个以@为结束符的字母序列是否为回文,即是否为形如“序列1&序列2”模式。其中序列1与序列2中都不含字符“&”,且序列2是序列1的逆序列。例如,“a+b&b+a”属于该模式的字符序列,而“1+3&3-1”则不属于该模式。
算法提示:
从左到右扫描字符序列,序列1首先进栈,然后序列1出栈并与序列2的字符依次比较。
11、括号匹配的检验
[问题描述]
从键盘输入任意括号序列,编程判断括号是否匹配。假设允许有三种括号:圆括号()、方括号[]和花括号{},其嵌套的顺序随意。如:{}(()[])或[([][])]等为正确嵌套格式,{[(])}或{(((])为不正确的格式。
[基本要求及提示]
输入{2*[3+4]+(4+5)-10},输出结果“此序列括号匹配”。
输入 {[()],输出结果“此序列括号不匹配”。
算法提示:
为了正确检验输入序列的括号匹配问题,要使用栈结构来实现。