北京信息科技大学 数据结构 实验二链栈循环队列和计算器的操作.docx
《北京信息科技大学 数据结构 实验二链栈循环队列和计算器的操作.docx》由会员分享,可在线阅读,更多相关《北京信息科技大学 数据结构 实验二链栈循环队列和计算器的操作.docx(18页珍藏版)》请在冰豆网上搜索。
![北京信息科技大学 数据结构 实验二链栈循环队列和计算器的操作.docx](https://file1.bdocx.com/fileroot1/2023-2/25/6d809d16-3138-4823-8c39-ea62d1df3778/6d809d16-3138-4823-8c39-ea62d1df37781.gif)
北京信息科技大学数据结构实验二链栈循环队列和计算器的操作
实验报告
课程名称数据结构
实验项目链栈、循环队列和计算器的操作
实验仪器计算机
系别计算机学院学院
专业
班级/学号
学生姓名
实验日期
成绩
指导教师
一 、实验目的
(1)熟悉链栈的操作方法
(2)熟悉循环队列的操作方法
(3)利用栈的特点来编写简易计算器
(4)了解各自的优缺点。
二、 实验内容
(1)用链栈实现数据的增、删、查功能
(2)用循环队列实现数据的增、删、查等功能
(3)用栈的知识来编写简易计算器
三、实验课时
4课时
四、实验步骤
1.仔细分析并理解数据结构这本书上提供的部分程序伪代码
2.根据所给的代码编写出主函数和一些需要用到的函数
3.将伪代码翻译为程序能用的代码
4.充分理解每段代码的含义以及它所起到的作用
5.编译调试,纠正错误并分析出错的原因
6.运行并测试
五、程序源代码
1.链栈:
#include
#include
typedefstructSNode
{
intdata;
structSNode*next;
}SNode,*Stack;
typedefstruct
{
Stacktop;
intlength;
}SqStack;//定义链式栈的结构体
intInitStack(SqStack&S)
{
S.top=NULL;
S.length=0;
return0;
}//初始化链式栈
intPush(SqStack&S,inte)
{
Stackp;
p=(Stack)malloc(sizeof(SNode));
if(!
p)exit(0);
p->data=e;
p->next=S.top;
S.top=p;
S.length++;
return0;
}//插入元素e
intPop(SqStack&S)
{
if(!
S.top)return0;
else
{
Stackq;
q=S.top;
S.top=S.top->next;
--S.length;
free(q);
}
return0;
}//删除栈顶元素e
intGetTop(SqStack&S)
{
if(!
S.top)return0;
else
{
printf("返回栈顶元素%5d\n",S.top->data);
}
return0;
}//返回栈顶元素
intPrintStack(SqStack&S)
{
Stackp;
printf("\n链式队列中的元素");
p=S.top;
if(S.top!
=NULL)
{
while(p!
=NULL)
{
printf("%5d",p->data);
p=p->next;
}
}
else
printf("队列为空\n");
printf("\n");
return0;
}//遍历链式栈
intClearStack(SqStack&S)
{
S.top=NULL;
printf("已置空链式栈");
printf("\n");
return0;
}//置空链式栈
voidmain()
{
SqStackS;
inte,m;
InitStack(S);
for(;;)
{
printf("1.插入元素;2.删除元素;3.栈顶元素;4.结束运行\n\n");
printf("选择:
");
scanf("%d",&m);
printf("\n");
switch(m)
{
case1:
printf("插入元素:
");scanf("%d",&e);Push(S,e);PrintStack(S);printf("\n");break;
case2:
Pop(S);PrintStack(S);printf("\n");break;
case3:
GetTop(S);printf("\n");break;
case4:
ClearStack(S);printf("\n");break;
default:
printf("输入指令有误!
");break;
}
}
}
2.循环队列:
#include
#include
#defineMAXQSIZE100//最大队列长度
#defineOK1
#defineOVERFLOW-2
#defineERROR0
typedefintQElemType;
typedefintStatus;
typedefstruct
{
QElemType*base;//初始化的动态分配存储空间
intfront;//头指针,若队列不空,指向队列头元素
intrear;//尾指针,若队列不空,指向队列尾元素的下一个的位置
}SqQueue;
StatusInitQueue(SqQueue&Q)
{//构造一个空队列Q
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!
Q.base)exit(OVERFLOW);//存储分配失败
Q.front=Q.rear=0;
returnOK;
}
intQueueLength(SqQueue&Q)
{
intx=0;
x=(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
printf("该队列长为:
%d",x);
return0;
}
StatusEnQueue(SqQueue&Q,QElemTypee)
{//插入元素e为Q的新的队尾元素
inty=0;
if((Q.rear+1)%MAXQSIZE==Q.front)returnERROR;//队列满
if(e==0)
{
printf("请输入要插入的值:
");
scanf("%d",&y);
Q.base[Q.rear]=y;
Q.rear=(Q.rear+1)%MAXQSIZE;
}
else
{
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
}
returnOK;
}
StatusDeQueue(SqQueue&Q,QElemTypee)
{//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if(Q.front==Q.rear)returnERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
returnOK;
}
intPut(SqQueue&Q,intn)
{
for(inti=0;i{
scanf("%d",&Q.base[i]);
EnQueue(Q,Q.base[i]);
}
returnOK;
}
voidOut(SqQueue&Q,intn)
{
printf("该队列为:
");
for(inti=0;iprintf("%d",Q.base[i]);
}
intmain()
{
inti=0,n=0,a=0,e=0;
SqQueueQ;
InitQueue(Q);
printf("请指定该队列有多少个元素:
");
scanf("%d",&n);
printf("请输入这%d个元素:
",n);
Put(Q,n);
Out(Q,n);
for(;;)
{
printf("\n请输入以下指令来进行操作:
1.插入2.删除3.清屏4.长度5.结束\n");
scanf("%d",&a);
switch(a)
{
case1:
EnQueue(Q,e);n++;Out(Q,n);break;
case2:
DeQueue(Q,e);n--;Out(Q,n);break;
case3:
system("cls");break;
case4:
QueueLength(Q);break;
case5:
return0;
default:
printf("输入指令有误!
");break;
}
}
return0;
}
3.计算器:
#include
#include
typedefstructSNode_T
{
chardata;
structSNode_T*next;
}SNode_T;
typedefstructSNode_N{
floatdata;
structSNode_N*next;
}SNode_N;
typedefstructSqStack_T{
intlength;
SNode_T*top;
}SqStack_T;
typedefstructSqStack_N
{
intlength;
SNode_N*top;
}SqStack_N;
voidInitStack_T(SqStack_T*S)
{
S->top=NULL;
S->length=0;
}
voidInitStack_N(SqStack_N*S)
{
S->top=0;
S->length=0;
}
intPush_T(SqStack_T*S,chare)
{
SNode_T*p;
p=(SNode_T*)malloc(sizeof(SNode_T));
if(!
p)exit(0);
p->data=e;
p->next=S->top;
S->top=p;
S->length++;
return1;
}
intPush_N(SqStack_N*S,floate)
{
SNode_N*p;
p=(SNode_N*)malloc(sizeof(SNode_N));
if(!
p)exit(0);
p->data=e;
p->next=S->top;
S->top=p;
S->length++;
return1;
}
charPop_T(SqStack_T*S)
{
chare;
SNode_T*p;
if(S->top==NULL)return-1;
p=S->top;
e=p->data;
S->top=p->next;
S->length--;free(p);
returne;
}
floatPop_N(SqStack_N*S)
{
floate;
SNode_N*p;
if(S->top==NULL)return-1;
p=S->top;
e=p->data;
S->top=p->next;
S->length--;free(p);
returne;
}
floatOperate(floata,charc,floatb)
{
floats;
switch(c){
case'+':
s=a+b;break;
case'-':
s=a-b;break;
case'*':
s=a*b;break;
case'/':
if(b!
=0)s=a/b;
else
printf("Inputerror!
");break;
}
returns;
}
intGetTop_N(SqStack_N*S)
{
inte;
SNode_N*p;
if(S->top==NULL)return-1;
p=S->top;
e=p->data;
returne;
}
charGetTop_T(SqStack_T*S)
{
chare;
SNode_T*p;
if(S->top==NULL)return-1;
p=S->top;
e=p->data;
returne;
}
intSuffix(charc,chars[])
{
inti=0;
while(s[i]!
=c)
i++;
returni;
}
charPrecede(chara,charb)
{
intp,q;
charm[9]="+-*/()=";
charn[9][9]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=",">>>>>>","<<<<="};
p=Suffix(a,m);
q=Suffix(b,m);
return(n[p][q]);
}
intIn(charc){
if(c!
='+'&&c!
='-'&&c!
='*'&&c!
='/'&&c!
='('&&c!
=')'&&c!
='=')
return1;
elsereturn0;
}
voidmain()
{
charc,x,theta;
inta,b,i;
SqStack_TOPTR;
SqStack_NOPND;
InitStack_T(&OPTR);
Push_T(&OPTR,'=');
InitStack_N(&OPND);
for(;;)
{
printf("请输入一个正确的表达式:
\n");
c=getchar();
while(c!
='='||GetTop_T(&OPTR)!
='=')
{
if(In(c))
{
i=c-48;
Push_N(&OPND,i);
c=getchar();
}
else
switch(Precede(GetTop_T(&OPTR),c))
{
case'<':
Push_T(&OPTR,c);c=getchar();
break;//栈顶元素优先权低
case'=':
x=Pop_T(&OPTR);c=getchar();
break;//脱括号并接受下一个字符
case'>':
//退栈并将运算结果入栈
theta=Pop_T(&OPTR);
b=Pop_N(&OPND);
a=Pop_N(&OPND);
Push_N(&OPND,Operate(a,theta,b));
break;
}
}
printf("运算结果是:
%d\n",GetTop_N(&OPND));
}
}
六、实验截图
(1)链栈:
1.插入数据:
2.删除数据:
3.查找栈顶:
(2)循环队列:
初始化:
1.创建队列:
2.插入:
3.队列长:
4.删除:
(3)计算器:
七、实验心得
1.通过这次实验让我充分了解了以前虽然学过但其实还不是很理解的顺序表和单链表的一些具体操作和原理。
2.在实际操作中,会出现很多问题,从这些问题中会反映出一大堆自己本身所存在的不足,让我认识到自己在编程中会经常出现的错误,下定决心在以后中不犯这种在别人看来是低级的错误
3.要学会经常拿别人的程序进行比较,看看谁的相对较好一些,学习一些别人程序中的亮点以及反思自己为什么没有做到