表达式的求值.docx
- 文档编号:5804435
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:16
- 大小:103.25KB
表达式的求值.docx
《表达式的求值.docx》由会员分享,可在线阅读,更多相关《表达式的求值.docx(16页珍藏版)》请在冰豆网上搜索。
表达式的求值
实验课程名称数据结构课程设计
专业班级计算机科学与技术10级1班
学生姓名
学号10410901019
指导教师冯韵
2012至201学年第一学期第一至九周
目录
1概述3
1.1课程设计内容3
1.2实验基本要3
2系统分析3
2.1实验主要步骤3
2.2具体操作3
3概要设计4
3.1模块分析4
3.2函数图5
3.2.1函数调用关系5
3.2.2个模块调用关系5
3.2.3完整流程图6
4详细设计6
4.1类型定义6
4.1.1队列类型定义6
4.1.2栈类型定义6
4.2中缀表达式到后缀表达式的转换7
4.3后缀表达式的计算8
4.4主函数9
5运行与测试9
6总结和心得9
7参考文献10
8附录后缀表达式的程序10
1概述
1.1课程设计内容
输入一个算术表达式,其中操作数必须为实数,运算符包括加、减、乘、除、小(圆)括号,试编写程序实现:
(1)构造一个空栈S,初始条件:
栈S已存在
(2)用P返回S的栈顶元素
(3)插入元素ch为新的栈顶元素
(4)删除S的栈顶元素
(5)判断字符是否是运算符,运算符即返回1
(6)判断运算符优先权,返回优先权高的
(7)输入表达式
(8)返回表达式的最终结果。
1.2实验基本要
1.界面友好,函数功能要划分好
2.总体设计应画一流程图,程序要加必要的注释
3.要提供程序测试方案
5.程序一定要经得起测试,功能齐全。
2系统分析
2.1实验主要步骤
(1)把中缀表达式变换为后缀表达式。
(2)根据后缀表达式计算表达式求值。
2.2具体操作
在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:
一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-*、/,用#表示结束。
算法输出:
表达式运算结果。
算法要点:
设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
GetTop(S)
初始条件:
栈S已存在。
操作结果:
用P返回S的栈顶元素。
Push(&S,ch)
初始条件:
栈S已存在。
操作结果:
插入元素ch为新的栈顶元素。
Pop(&S)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素。
In(ch)
操作结果:
判断字符是否是运算符,运算符即返回1。
Precede(c1,c2)
初始条件:
c1,c2为运算符。
操作结果:
判断运算符优先权,返回优先权高的。
Operate(a,op,b)
初始条件:
a,b为整数,op为运算符。
操作结果:
a与b进行运算,op为运算符,返回其值。
num(n)
操作结果:
返回操作数的长度。
EvalExpr()
初始条件:
输入表达式合法。
操作结果:
返回表达式的最终结果。
}ADTStack
3概要设计
3.1模块分析
本系统从整体上分为6大模块:
1)主程序模块:
2)栈的初始化:
分别初始化两个栈,一个操作数栈,一个操作符栈;
3)栈的创建:
接受数据,分别创建两个栈;
4)输出后缀表达式;
5)表达式计算;
6)输出计算结果;
3.2函数图
3.2.1函数调用关系
3.2.2个模块调用关系
主程序模块
初始化两个栈
栈的创建
输出后缀表达式
表达式计算
输出计算结果
3.2.3完整流程图
4详细设计
4.1类型定义
4.1.1队列类型定义
typedefcharDataType;
typedefstruct
{
chardata[100];
intfront,rear;
}SeqQueue;
4.1.2栈类型定义
typedefstruct
{
DataTypedata[100];
inttop;
}SeqStack;
4.2中缀表达式到后缀表达式的转换
voidCTPostExp(SeqQueue*Q)
{
SeqStackOS;
charc,t;
SeqStack*S;
S=&OS;
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!
='#');
}
intPriority(DataTypeop)
{
switch(op)
{
case'(':
case'#':
return0;break;
case'-':
case'+':
return1;break;
case'*':
case'/':
return2;break;
}
}
4.3后缀表达式的计算
intCPostExp(SeqQueue*Q)
{
SeqStackvs,*S;
charch;
intx,y;
S=&vs;
InitStack(S);
while(!
QueueEmpty(Q))
{
ch=DeQueue(Q);
if(ch>='0'&&ch<='9')
Push(S,ch-'0');//队列减1
else
{
y=Pop(S);
x=Pop(S);
switch(ch)
{
case'+':
Push(S,x+y);break;
case'-':
Push(S,x-y);break;
case'*':
Push(S,x*y);break;
case'/':
Push(S,x/y);break;
}
}
}
returnGetTop(S);
}
4.4主函数
voidmain()
{
inta;
SeqQueue*Q;
SeqQueuePostQ;//定义队列,存放后缀表达式
Q=&PostQ;
InitQueue(Q);//初始化队列
CTPostExp(Q);//调用函数将中缀表达式转换为后缀表达式
while(!
QueueEmpty(Q))//shuchuhouzhuibiaodashi
printf("%c",DeQueue(Q));
printf("\n");
a=CPostExp(Q);
printf("%d",a);
}
5运行与测试
6总结和心得
这次的课程设计让我更加了解了C语言和课程设计,实验代码其实不算长,只是书上的代码不算完整,有些还要自己写上去,在写的过程中就会出现很多的问题,比如说有些函数的应用不太清楚,或者是结构搞错了,又或者是算法不太对,等等。
但是,每做一次实验就会有一点收获,不管在哪些知识点,都算得上是一次进步
在以后的试验中,我会更加的注意一些程序上的小问题。
我会跟家努力,争取在每一次的试验中都有不同程度的进步
7参考文献
[1].严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社
[2]苏仕华主编《数据结构课程设计》机械工业出版社
[3]严蔚敏、吴伟民《数据结构习题集》(C语言版)清华大学出版社
8附录后缀表达式的程序
#include
#defineStackSize100
#defineQueueSize100
typedefcharDataType;
typedefstruct{
chardata[100];
intfront,rear;
}SeqQueue;//队列的定义
typedefstruct{
DataTypedata[100];
inttop;
}SeqStack;//栈类型的定义
intDeQueue(SeqQueue*Q);
voidInitQueue(SeqQueue*Q);
intQueueEmpty(SeqQueue*Q);
voidEnQueue(SeqQueue*Q,DataTypex);
voidInitStack(SeqStack*S);
voidPush(SeqStack*S,DataTypex);
DataTypePop(SeqStack*S);
DataTypeGetTop(SeqStack*S);
intPriority(DataTypeop);
voidCTPostExp(SeqQueue*Q);
voidInitQueue(SeqQueue*Q)//初始化队列
{
Q->front=0;Q->rear=0;
}
intQueueEmpty(SeqQueue*Q)//判断队列是否为空
{
returnQ->front==Q->rear;
}
voidEnQueue(SeqQueue*Q,DataTypex)//把输入的数字进队列
{
if((Q->rear+1)%QueueSize==Q->front)//判断队列是否满了
printf("Queueoverflow");
else
{
Q->data[Q->rear]=x;
Q->rear=Q->rear+1;
}
}
intDeQueue(SeqQueue*Q)//队列输出
{charx;
x=Q->data[Q->front];
Q->front=Q->front+1;
returnx;
}
voidInitStack(SeqStack*S)//初始化栈
{
S->top=-1;
}
voidPush(SeqStack*S,DataTypex)//对输入的元素进行进栈
{
if(S->top==StackSize-1)//判断是否栈满
printf("stackoverflow");
else
{
S->top=S->top+1;//不能进行交换
S->data[S->top]=x;
}
}
DataTypePop(SeqStack*S)//出栈
{
if(S->top==-1)
printf("stackunderflow");
else
returnS->data[S->top--];
}
DataTypeGetTop(SeqStack*S)//取栈顶元素
{
if(S->top==-1)
printf("stackempty");
else
returnS->data[S->top];
}
intPriority(DataTypeop)//优先级的比较
{
switch(op)
{case'(':
case'#':
return(0);
case'+':
case'-':
return
(1);
case'*':
case'/':
return
(2);
}
}
voidCTPostExp(SeqQueue*Q)//对输入的字符进行处理
{SeqStackOS;//运算栈符
charc,t;
SeqStack*S;
S=&OS;
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!
='#');
}
voidCPostExp(SeqQueue*Q)
{
SeqStackVS,*S;
charch;
intx,y;
S=&VS;
InitStack(S);
while(Q->front!
=Q->rear)
{
ch=DeQueue(Q);
printf("%c",ch);
if(ch>='0'&&ch<='9')
Push(S,ch-'0');
else
{y=Pop(S);
x=Pop(S);
switch(ch)
{case'+':
Push(S,x+y);break;
case'-':
Push(S,x-y);break;
case'*':
Push(S,x*y);break;
case'/':
Push(S,x/y);break;
}
}
}
printf("\n最后的答案是:
\n");
printf("%d",GetTop(S));
//returnGetTop(S);
}
voidmain()
{SeqQueue*Q;
SeqQueuePostQ;
Q=&PostQ;
InitQueue(Q);
CTPostExp(Q);
CPostExp(Q);
printf("\n");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式 求值
![提示](https://static.bdocx.com/images/bang_tan.gif)