数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx

上传人:b****4 文档编号:15989476 上传时间:2022-11-17 格式:DOCX 页数:14 大小:47.27KB
下载 相关 举报
数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx_第1页
第1页 / 共14页
数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx_第2页
第2页 / 共14页
数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx_第3页
第3页 / 共14页
数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx_第4页
第4页 / 共14页
数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx

《数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构课程设计带括号的算术表达式求值Word格式文档下载.docx

四、算法描述:

1.头文件:

Stack.h

Calculator.h

Method:

Stackmethod:

Push();

//进栈操作

Pop();

//出栈操作

GetHead();

//返回栈中的最顶层元素

MakeEmpty();

//清空栈操作

Calculatormethod:

Calculator();

//计算主体celarstream();

//清空输入流

Prior();

//返回运算符的优先级done();

//做一次二元运算output();

//打印结果并输出

EnEmpty();

//调用MakeEmpty(),并清空栈

2.cpp文件

Calculator.cpp

intmain();

//主程序

3.程序流程图

优先级比较算法

 

Data算法

存放操作字符存放数据

调用Calculator。

结束

4.功能描述

(1)所有函数都是在calculator。

函数为主体,调用其他函数开始的。

Calculator函数让输

入的中缀表达式按字符读取。

(2)如果读取为操作数,则将字符返回输入流(cin.putback),读操作数并进data栈,然后

读入下一字符送入ch。

(3)如果读取为操作符,则判断操作符类型,确定优先级。

不同的优先数的操作符进行不同的运算。

⑷用output函数进行结果等的输出。

⑸Enempty为清空两个栈。

(6)主函数调用时,创建calculator实例,调用calculator函数进行计算,然后调用output函数进行输出,最后调用enempty清空栈。

注:

程序有两个栈,分别为data和sign。

分别存放操作数和操作符;

此程序要求输入的是中缀表达式,即直接对中缀表达式求值,不用转化为后缀在求值。

五、源程序清单:

Stack.h#include<

iostream.h>

#include<

string.h>

stdio.h>

stdlib.h>

assert.h>

#defineERROR-1#defineBLANK0#defineDATA1#defineKUOHAO15#defineKUOHAO22#defineADD_OR_SUB3#defineMUT_OR_DIV4constintsize=500;

template<

classElem>

classStack;

classStackNode//堆栈的结点类{

friendclassStack<

Elem>

;

Elemelem;

StackNode<

*link;

StackNode(Eleme=0,StackNode<

*l=NULL):

elem(e),link(l)

{//cout<

<

"

elemis:

"

e<

endl;

}

};

template<

classStack

{

intnumber;

*head;

public:

Stack():

number(0),head(NULL){}

~Stack()

*tmp=head;

while(head!

=NULL)

head=head->

link;

deletetmp;

tmp=head;

voidPush(constElem&

e)

number++;

head=newStackNode<

(e,head);

voidMakeEmpty()

{head=head->

deletetmp;

tmp=head;

number=0;

voidPop()

assert(number!

=0);

number--;

head=head->

ElemGetHead()

returnhead->

elem;

intGetNumber()const{returnnumber;

}//返回堆栈中元素的数目};

classCalculator

private:

Stack<

double>

data;

//数据栈

char>

sign;

//运算符栈

intflag;

//标志位表示前一个输入的是数还是一个运算符

Calculator()

flag=BLANK;

~Calculator(){}

intPrior(charch)const//返回运算符的优先级

switch(ch)

case'

)'

:

return1;

+'

case'

-'

return2;

*'

/'

return3;

('

return5;

default:

return-1;

voidclearstream()//清空输入流

charch;

while(cin>

>

ch,ch!

='

'

);

voiddone(charch)//做一次二元运算

doublea,b;

a=data.GetHead();

data.Pop();

b=data.GetHead();

switch(ch)

b+=a;

break;

b-=a;

b*=a;

if(a==0)

{cout<

除数为零!

返回系统默认值如下"

b/=a;

break;

default:

data.Push(b);

voidCalculate()

doubled;

if(ch>

0'

&

&

ch<

9'

||ch=='

.'

if(flag==DATA)

\nErrorinput!

小数点只能有一位!

flag=ERROR;

clearstream();

return;

cin.putback(ch);

cin>

d;

data.Push(d);

flag=DATA;

else//如果输入的是字符,则作出判断

intprio=Prior(ch);

chartempch,chprior;

switch(prio)

case-1:

cout<

不允许的字符"

flag=ERROR;

case1:

//如果是一个后括号,

tempch=sign.GetHead();

//是合法的运算,取一个运算符

flag=KUOHAO2;

while(tempch!

)//做完这一重括号内的所有运算

sign.Pop();

done(tempch);

if(sign.GetNumber()!

=0)

case2:

//如果读入的是一个+或者-号,

//如果+前面没有数据,或者+是被写在括号里的,则向//它的前面压入一个0到data

if(flag==BLANK||data.GetNumber()==0||flag==KUOHAO1)

data.Push(0);

//push0tostack

//sign.Push(ch);

//push+/-tostack

//如果它前面是一个后括号,因后括号里的内容已经做过//运算,故

只当一个一般的来做

if(flag==KUOHAO2||flag==DATA)

while(sign.GetNumber()&

sign.GetHead()!

Prior(sign.GetHead())>

=Prior(ch))

done(sign.GetHead());

flag=ADD_OR_SUB;

sign.Push(ch);

case3:

//如果当前输入是一个*或者/号

//如果前一个输入是一个*或者/号

//如果它前面不只一个数字,则做它前面的运算if(data.GetNumber()!

=1)

chprior=Prior(sign.GetHead());

if(chprior>

=Prior(ch)&

chprior=sign.GetHead();

done(chprior);

sign.Push(ch);

flag=MUT_OR_

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

当前位置:首页 > 考试认证 > 公务员考试

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

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