表达式的求值Word文档格式.docx
《表达式的求值Word文档格式.docx》由会员分享,可在线阅读,更多相关《表达式的求值Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
栈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)
插入元素ch为新的栈顶元素。
Pop(&
删除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栈类型定义
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;
0'
1'
2'
3'
4'
5'
6'
7'
8'
9'
EnQueue(Q,c);
('
Push(S,c);
)'
do
{
t=Pop(S);
if(t!
='
&
&
t!
)
EnQueue(Q,t);
}while(t!
S->
top!
=-1);
+'
-'
*'
/'
while(Priority(c)<
=Priority(GetTop(S)))
EnQueue(Q,t);
}
Push(S,c);
break;
}
}while(c!
}
intPriority(DataTypeop)
switch(op)
case'
return0;
break;
return1;
return2;
}
4.3后缀表达式的计算
intCPostExp(SeqQueue*Q)
SeqStackvs,*S;
charch;
intx,y;
vs;
while(!
QueueEmpty(Q))
ch=DeQueue(Q);
if(ch>
ch<
Push(S,ch-'
//队列减1
else
y=Pop(S);
x=Pop(S);
switch(ch)
case'
Push(S,x+y);
Push(S,x-y);
Push(S,x*y);
Push(S,x/y);
returnGetTop(S);
4.4主函数
voidmain()
inta;
SeqQueue*Q;
SeqQueuePostQ;
//定义队列,存放后缀表达式
Q=&
PostQ;
InitQueue(Q);
//初始化队列
CTPostExp(Q);
//调用函数将中缀表达式转换为后缀表达式
QueueEmpty(Q))//shuchuhouzhuibiaodashi
printf("
%c"
DeQueue(Q));
printf("
\n"
a=CPostExp(Q);
%d"
a);
5运行与测试
6总结和心得
这次的课程设计让我更加了解了C语言和课程设计,实验代码其实不算长,只是书上的代码不算完整,有些还要自己写上去,在写的过程中就会出现很多的问题,比如说有些函数的应用不太清楚,或者是结构搞错了,又或者是算法不太对,等等。
但是,每做一次实验就会有一点收获,不管在哪些知识点,都算得上是一次进步
在以后的试验中,我会更加的注意一些程序上的小问题。
我会跟家努力,争取在每一次的试验中都有不同程度的进步
7参考文献
[1].严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社
[2]苏仕华主编《数据结构课程设计》机械工业出版社
[3]严蔚敏、吴伟民《数据结构习题集》(C语言版)清华大学出版社
8附录后缀表达式的程序
#include<
stdio.h>
#defineStackSize100
#defineQueueSize100
typedefstruct{
//队列的定义
typedefstruct{
//栈类型的定义
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)//判断队列是否满了
Queueoverflow"
else
Q->
data[Q->
rear]=x;
rear=Q->
rear+1;
intDeQueue(SeqQueue*Q)//队列输出
{charx;
x=Q->
front];
front=Q->
front+1;
returnx;
voidInitStack(SeqStack*S)//初始化栈
top=-1;
voidPush(SeqStack*S,DataTypex)//对输入的元素进行进栈
if(S->
top==StackSize-1)//判断是否栈满
stackoverflow"
S->
top=S->
top+1;
//不能进行交换
data[S->
top]=x;
DataTypePop(SeqStack*S)//出栈
top==-1)
stackunderflow"
else
returnS->
top--];
DataTypeGetTop(SeqStack*S)//取栈顶元素
stackempty"
top];
intPriority(DataTypeop)//优先级的比较
switch(op)
{case'
return(0);
return
(1);
return
(2);
voidCTPostExp(SeqQueue*Q)//对输入的字符进行处理
{SeqStackOS;
//运算栈符
SeqStack*S;
//初始化栈
//将#号压入栈底
do
{c=getchar();
//将空格去除
//把数字压入队列
//将"
("
进栈
do{t=Pop(S);
if(t!
}while(t!
while(Priority(c)<
EnQueue(Q,t);
voidCPostExp(SeqQueue*Q)
SeqStackVS,*S;
VS;
while(Q->
front!
=Q->
rear)
ch);
if(ch>
ch<
{y=Pop(S);
switch(ch)
{case'
case'
\n最后的答案是:
%d"
GetTop(S));
//returnGetTop(S);
{SeqQueue*Q;
CPostExp(Q);