数据结构~栈和队列应用表达式求值.doc
- 文档编号:251335
- 上传时间:2022-10-07
- 格式:DOC
- 页数:7
- 大小:56KB
数据结构~栈和队列应用表达式求值.doc
《数据结构~栈和队列应用表达式求值.doc》由会员分享,可在线阅读,更多相关《数据结构~栈和队列应用表达式求值.doc(7页珍藏版)》请在冰豆网上搜索。
2011-2012学年第一学期
数据结构课内实验报告
实验名:
栈和队列的应用:
表达式的求值
姓名:
张蓉
学号:
09411100126
班级:
信息与计算科学091班
指导老师:
肖小克
日期:
2011年10月21日
实验题目:
1、实验目的:
通过此实验进一步理解栈和队列,提高运用理论解决实际问题的能力。
2、实验内容:
例如,输入9-(2+4*7)/5+3#,并按回车键,即可输出结果如下:
表达式的运算结果是:
6
表达式的后缀表达式为:
9247*+5/-3+
3、数据结构及算法思想:
表达式计算是实现程序设计逻辑语言的基本问题之一,也是栈和队列应用的一个典型的例子。
该设计是先通过栈将中缀表达式转换为后缀表达式,在转换过程中又用到了队列的操作。
而在得到后缀表达式之后,又用到队列的操作对生成的后缀表达式进行计算。
在整个设计的实现过程中,用到的都是栈和队列的概念。
4、模块化分:
本程序分为2个模块:
(1)中缀表达式转换为后缀表达式;
(2)求后缀表达式
5、详细设计及运行结果:
(1)中缀表达式转换为后缀表达式
voidCTPostExp(SeqQueue*Q){
SeqStackS;//运算符栈
charc,t;
InitStack(&S);//初始化栈
Push(&S,'#');//压入栈底元素‘#’
do{//扫描中缀表达式
c=getchar();
switch(c){
case'':
break;//去除空格符
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
EnQueue(Q,c);break;
case'(':
Push(&S,c);break;
case')':
case'#':
do{
t=Pop(&S);
if(t!
='('&&t!
='#')EnQueue(Q,t);
}while(t!
='('&&S.top!
=-1);break;
case'+':
case'-':
case'*':
case'/':
while(Priority(c)<=Priority(GetTop(S))){
t=Pop(&S);EnQueue(Q,t);
}
Push(&S,c);break;
}
}while(c!
='#');//以'#'号结束表达式扫描
}
(2)后缀表达式的计算
DataTypeCPostExp(SeqQueueQ){
SeqStackS;
charch;
intx,y;
InitStack(&S);
while(!
QueueEmpty(Q)){
ch=DeQueue(&Q);
if(ch>='0'&&ch<='9')
Push(&S,ch);
else{
y=Pop(&S)-'0';
x=Pop(&S)-'0';
switch(ch){
case'+':
Push(&S,(char)(x+y+'0'));break;
case'-':
Push(&S,(char)(x-y+'0'));break;
case'*':
Push(&S,(char)(x*y+'0'));break;
case'/':
Push(&S,(char)(x/y+'0'));break;
}
}
}
returnGetTop(S);
}
输入9-(2+4*7)/5+3#,并按回车键,
输出:
表达式的运算结果是:
6
表达式的后缀表达式为:
9247*+5/-3
6、调试情况,设计技巧及体会:
表达式是由运算对象、运算符、括号组成的有意义的式子。
要写此程序,必须了解到底什么是中缀表达式、后缀表达式并灵活运用栈和队列。
7、源程序清单:
#include
#defineStackSize100
#defineQueueSize100
/*队列的相关操作*/
typedefcharDataType;
typedefstruct{
chardata[100];
intfront,rear;
}SeqQueue;//定义队列类型
voidInitQueue(SeqQueue*Q){//初始化队列
Q->front=0;
Q->rear=0;
}
intQueueEmpty(SeqQueueQ){//判空队列
returnQ.rear==Q.front;
}
voidEnQueue(SeqQueue*Q,DataTypex){//入队列
if((Q->rear+1)%QueueSize==Q->front)
printf("Queueoverflow");
else{
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
DataTypeDeQueue(SeqQueue*Q){
charx;
if(QueueEmpty(*Q))return0;
else{
x=Q->data[Q->front];
Q->front=(Q->front+1)%QueueSize;
returnx;
}
}/*栈的相关操作*/
typedefstruct{
DataTypedata[100];
inttop;
}SeqStack;//栈类型的定义
voidInitStack(SeqStack*S){//初始化栈
S->top=-1;
}
voidPush(SeqStack*S,DataTypex){//入栈
if(S->top==StackSize-1)
printf("Stackouerflow");
else{
S->top=S->top+1;
S->data[S->top]=x;
}
}
DataTypePop(SeqStack*S){//出栈
if(S->top==-1){
printf("stackunderflow");
return0;
}
else
returnS->data[S->top--];
}
DataTypeGetTop(SeqStackS){
//取栈顶元素
if(S.top==-1){
printf("stackempty");
return0;
}
else
returnS.data[S.top];
}//求运算符优先级函数
intPriority(DataTypeop){
switch(op){
case'(':
case'#':
return0;
case'-':
case'+':
return1;
case'*':
case'/':
return2;
}
return-1;
}
voidCTPostExp(SeqQueue*Q){
SeqStackS;//运算符栈
charc,t;
InitStack(&S);//初始化栈
Push(&S,'#');//压入栈底元素‘#’
do{//扫描中缀表达式
c=getchar();
switch(c){
case'':
break;//去除空格符
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
EnQueue(Q,c);break;
case'(':
Push(&S,c);break;
case')':
case'#':
do{
t=Pop(&S);
if(t!
='('&&t!
='#')EnQueue(Q,t);
}while(t!
='('&&S.top!
=-1);break;
case'+':
case'-':
case'*':
case'/':
while(Priority(c)<=Priority(GetTop(S))){
t=Pop(&S);EnQueue(Q,t);
}
Push(&S,c);break;
}
}while(c!
='#');//以'#'号结束表达式扫描
}//后缀表达式的计算
DataTypeCPostExp(SeqQueueQ){
SeqStackS;
charch;
intx,y;
InitStack(&S);
while(!
QueueEmpty(Q)){
ch=DeQueue(&Q);
if(ch>='0'&&ch<='9')
Push(&S,ch);
else{
y=Pop(&S)-'0';
x=Pop(&S)-'0';
switch(ch){
case'+':
Push(&S,(char)(x+y+'0'));break;
case'-':
Push(&S,(char)(x-y+'0'));break;
case'*':
Push(&S,(char)(x*y+'0'));break;
case'/':
Push(&S,(char)(x/y+'0'));break;
}
}
}
returnGetTop(S);
}
voidmain(){
SeqQueueQ;//定义队列,存放后缀表达式
InitQueue(&Q);//初始化队列
CTPostExp(&Q);//调用转换函数将中缀表达式转换成后缀表达式
printf("表达式的运算结果是:
%c\n"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 队列 应用 表达式 求值
![提示](https://static.bdocx.com/images/bang_tan.gif)