表达式的求值Word文档格式.docx

上传人:b****6 文档编号:18791490 上传时间:2023-01-01 格式:DOCX 页数:16 大小:103.25KB
下载 相关 举报
表达式的求值Word文档格式.docx_第1页
第1页 / 共16页
表达式的求值Word文档格式.docx_第2页
第2页 / 共16页
表达式的求值Word文档格式.docx_第3页
第3页 / 共16页
表达式的求值Word文档格式.docx_第4页
第4页 / 共16页
表达式的求值Word文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

表达式的求值Word文档格式.docx

《表达式的求值Word文档格式.docx》由会员分享,可在线阅读,更多相关《表达式的求值Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

表达式的求值Word文档格式.docx

栈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);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1