实验二 堆栈和队列基本操作的编程实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二堆栈和队列基本操作的编程实现
【实验目的】
堆栈和队列基本操作的编程实现
要求:
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】
验证性实验(学时数:2H)
【实验内容】
内容:
把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。可以实验一的结果自己实现数据输入、数据显示的函数。
利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。
【思考问题】
1.栈的顺序存储和链表存储的差异?
2.还会有数据移动吗?为什么?
3.栈的主要特点是什么?队列呢?
4.栈的主要功能是什么?队列呢?
5.为什么会有环状队列?
【参考代码】
(一)利用顺序栈实现十进制整数转换转换成r进制
1、算法思想
将十进制数N转换为r进制的数,其转换方法利用辗转相除法,以N=3456,r=8为例转换方法如下:
N N / 8 (整除)N % 8(求余)
3456 432 0 低
432 54 0
54 6 6
6 0 6 高
所以:(3456)10 =(6600)8
我们看到所转换的8进制数按底位到高位的顺序产生的,而通常的输出是从高位到低位的,恰好与计算过程相反,因此转换过程中每得到一位8进制数则进栈保存,转换完毕后依次出栈则正好是转换结果。
算法思想如下:当N>0时重复1,2
①若N≠0,则将N % r 压入栈s中,执行2;若N=0,将栈s的内容依次出栈,算法结束。
②用N / r 代替N
2、转换子程序
#include
#define L_size 100 //根据需要自己定义L_size为顺序栈的最大存储容量
void conversion(int N,int r)
{ //将十进制数N转换为r进制的数
int s[L_size],top;
//定义一个顺序栈,top为栈顶指针,注意此处没有使用结构体类型int x;
top=-1; //初始化栈
while (N!=0) //此循环为入栈操作
{
s[++top]= ; //余数入栈
; //商作为被除数继续
}
while (top!=-1) //此循环为出栈操作
{
x=s[top--];
if(x==10)printf("A");
else if(x==11)printf("B");
else if(x==12)printf("C");
else if(x==13)printf("D");
else if(x==14)printf("E");
else if(x==15)printf("F");
else printf("%d",x);
}
printf("\n");
}
3、编写主函数验证上述转换子函数是否正确。
void main() //自己设计主函数完成
{
int number,r; //number为待准备转换的十进制数,r为进制
printf("请输入一个十进制整数:");
scanf("%d",&number);
printf("选择将该数转换为几进制数(2,8,16):");
scanf("%d",&r);
printf("转换后的结果为:");
conversion(number,r);
}
(二)用顺序栈实现算术后缀表达式求值
1、算法思想。
后缀表达式求值步骤:
a、循环读出后缀表达式中的每一个字符;
b、若是数字,将对应的字符串转换成整数,入栈;
c、若是运算符,从栈中弹出2个数,将运算结果再压入栈;
d、若表达式输入完毕,栈顶即表达式值;
2、后缀表达式求值子程序
#include
#include
#define L_size 50
void postexp()
{
int st[L_size],top=-1; //定义一个顺序栈,top为栈顶指针
int d=0; //定义用来字符串转换整数的变量d
char ch;
printf("请输入规范的后缀表达式(操作数、运算符之间使用空格间隔开,eg:3 2 5 * +):\n"); //输入范例
while((ch=getchar())!='\n') //开始输入字符并赋给ch
{
if(ch==' ') //如果输入的是空格,不做处理
else
switch(ch) //判断输入是否运算符,如果时就进行相应的操作
{
case '+':
;
;
break;
case '-':
st[top-1]=st[top-1]-st[top];
top--;
break;
case '*':
st[top-1]=st[top-1]*st[top];
top--;
break;
case '/':
if(st[top]!=0)//分母不为零计算才有效
{
st[top-1]=st[top-1]/st[top];
top--;
}
else
{
printf("除数为0!\n"); //分母为零计算无效,退出程序
exit(1);
}
break;
default:
while(ch>='0'&&ch<='9')
{
;
ch=getchar();