实验二 栈和队列
一、实验目的和要求
1、理解栈的存储结构及基本操作实现。
2、掌握应用栈解决问题的方法。
3、掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。
二、实验仪器和设备
微型计算机
三、实验内容与过程
1、验证性实验:实现顺序栈的基本操作
实验内容:编写一个程序sqstack.cpp (或.c),实现顺序栈的各种基本运算(假设栈中元素类型SElemType为char),并在此基础上设计一个程序exp3-1.cpp (或.c)完成以下功能。
(1) 初始化栈S。
(2) 判断栈是否为空。
(3) 将元素a、b、c、d、e依次进栈。
(4) 输出栈顶元素。
(5) 输出栈的长度。
(6) 将栈中元素依次出栈并输出。
(7) 判断栈是否为空。
(8) 销毁栈。
2、验证性实验:实现链栈的基本操作
实验内容:编写一个程序listack.cpp (或.c),实现链栈的各种基本运算(假设栈中元素类型SElemType为char),并在此基础上设计一个程序exp3-2.cpp (或.c)完成以下功能。
(1) 初始化栈S。
(2) 判断栈是否为空。
(3) 将元素a、b、c、d、e依次进栈。
(4) 输出栈顶元素。
(5) 输出栈的长度。
(6) 将栈中元素依次出栈并输出。
(7) 判断栈是否为空。
(8) 销毁栈。
3、验证性实验:实现循环队列的基本操作
实验内容:编写一个程序sqqueue.cpp (或.c),实现循环队列的各种基本运算(假设队中元素类型QElemType为char),并在此基础上设计一个程序exp3-3.cpp (或.c)完成以下功能。
(1) 初始化队列Q。
(2) 判断队列是否为空。
(3) 将元素a、b、c依次入队。
(4) 出队一个元素并输出。
(5) 输出队列的长度。
(6) 将元素d、e、f依次入队。
(7) 将队中元素依次出队并输出。
(8) 销毁队列。
4、验证性实验:实现链队列的基本操作
实验内容:编写一个程序liqueue.cpp (或.c),实现链队列的各种基本运算(假设队中元素类型QElemType为char),并在此基础上设计一个程序exp3-4.cpp (或.c)完成以下功能。
(1) 初始化队列Q。
(2) 判断队列是否为空。
(3) 将元素a、b、c依次入队。
(4) 出队一个元素并输出。
(5) 输出队列的长度。
(6) 将元素d、e、f依次入队。
(7) 将队中元素依次出队并输出。
(8) 销毁队列。
5、设计性实验:括号匹配的检验
实验内容:编写程序exp3-5.cpp (或.c)实现以下功能:判断一个算术表达式中的花括号、方括号和圆括号是否配对,若能够全部配对则返回逻辑真,否则返回逻辑假。
6、设计性实验:判断是否为回文单词
实验内容:编写程序exp3-6.cpp (或.c)判定给定的字符序列是否为回文。回文是指正读、反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。
实验提示:通过将一个待判断的字符序列按照从前往后的顺序依次进栈后,再将栈内元素逐一出栈并与待判断字符序列的字母依次比较。
7、(选做题)设计性实验:兔子繁殖问题
实验内容:编写程序exp3-7.cpp (或.c)实现以下功能:使用循环顺序队列的基本操作来计算某个月的兔子总数。
实验背景:在700多年前,意大利著名数学家斐波那契 (Fibonacci) 在他的《算盘全集》提出了有趣的兔子繁殖问题:如果一开始有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生的第三个月也都生下一对小兔。他对各个月的兔子对数进行了仔细观察,从中发现了一个十分有趣的规律,就是后面一个月份的兔子总对数,恰好等于前面两个月份兔子总对数的和,如果再把原来兔子的对数重复写一次,于是得到了1,2,3,5,8,13,21,34,…。
实验提示:要求某个月的兔子总数,借助于开始的小兔数目和第一个月的小兔总数目,可以求出第二个月的小兔总数目;然后由第一个月的小兔总数和第二个月的总数,可以求出第三个月的小兔总数。依次类推,最终可以求出第n个月的小兔总数。本题要求采用循环顺序队列的基本操作来求某个月的小兔总数,可以把第n-2个月和第n-1个月的小兔总数依次放入队列中,将队首元素(即第n-2个月的小兔总数)出队并记下其值,获取队首元素(即第n-1个月的小兔总数)并记下其值,将两次记下的值相加即为第n个月的小兔总数,然后将第n个月的小兔总数放入队列中。在求第n+1个月的小兔总数时,就可以再将当前队首元素(即第n-1个月的小兔总数)出队并记下其值,获取当前队首元素(即第n个月的小兔总数)并记下其值,将记下的两个值相加即得到第n+1个月的小兔总数。据此,就可以计算任意一个月的小兔总数。
四、实验结果与分析(程序运行结果及其分析)
- exp3-1
#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define MAX 100
#define overflow -2
#define error 0
#define ok 1
typedef char SElemType;//定义栈的类型
typedef char status;
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}sqstack;
status initstack(sqstack &S) //栈的初始化
{
S.base=new SElemType[MAX];
if(!S.base) exit(overflow);
S.top=S.base;
S.stacksize=MAX;
return ok;
}
status YON(sqstack &S)//判断栈是否为空
{
if(S.top==S.base)
return error;
else return ok;
}
status push(sqstack &S,SElemType e)//入栈
{
if(S.top-S.base==S.stacksize) return error;
*S.top++=e;
return ok;
}
status pop(sqstack &S,SElemType &e)//出栈
{
if(S.top==S.base) return error;
e=*--S.top;
return e;
}
SElemType gettop(sqstack S)//取栈
{
if(S.top!=S.base)
return *(S.top-1);
}
length(sqstack &S)//栈长
{
int l;
l=S.top-S.base;
return l;
}
sqpop(sqstack &S)//逐个输出栈内元素
{
if(YON(S)==error) exit(error);
while(S.top!=S.base)
{
char n;
n=pop(S,n);
printf("%c",n);
}
}
void DestroyStack(sqstack S)
{
delete S.base;
}
main()
{
int a,lengt;
char Top;
sqstack S;
initstack(S);
a=YON(S);
printf("(1)初始化栈S。\n") ;
printf("(2)初始时判断,空栈为0,非空栈为1,此时此栈为:%d\n",a);
printf("(3)将元素a、b、c、d、e依次进栈。\n") ;
push(S,'a');
push(S,'b');
push(S,'c');