实验二栈和队列

实验二  栈和队列

一、实验目的和要求

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个月的小兔总数。据此,就可以计算任意一个月的小兔总数。

四、实验结果与分析(程序运行结果及其分析)

  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');

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值