实验二 堆栈和队列基本操作的编程实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

相关文档
最新文档