实用参考四则运算表达式求值实验报告docxWord文档格式.docx

上传人:b****6 文档编号:17338292 上传时间:2022-12-01 格式:DOCX 页数:9 大小:28.44KB
下载 相关 举报
实用参考四则运算表达式求值实验报告docxWord文档格式.docx_第1页
第1页 / 共9页
实用参考四则运算表达式求值实验报告docxWord文档格式.docx_第2页
第2页 / 共9页
实用参考四则运算表达式求值实验报告docxWord文档格式.docx_第3页
第3页 / 共9页
实用参考四则运算表达式求值实验报告docxWord文档格式.docx_第4页
第4页 / 共9页
实用参考四则运算表达式求值实验报告docxWord文档格式.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

实用参考四则运算表达式求值实验报告docxWord文档格式.docx

《实用参考四则运算表达式求值实验报告docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《实用参考四则运算表达式求值实验报告docxWord文档格式.docx(9页珍藏版)》请在冰豆网上搜索。

实用参考四则运算表达式求值实验报告docxWord文档格式.docx

输出

后缀表达式为:

//输出结果的位置

表达式的值为:

三、调试分析

本次实验的难点主要是在建立二叉树的问题上。

关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。

因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。

另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。

四、测试结果

五、用户使用说明(可选)

1、运行程序时

提示输入四则运算表达式

本程序可以将中缀表达式转化为后缀表达式,并计算结果

请输入四则运算表达式:

输出

后缀表达式为:

程序源代码(c++)

#include<

iostream>

string>

stack>

iomanip>

constintMaG=100;

usingnamespacestd;

classNode{

public:

charch[MaG];

//考虑到数值有时会是两位数,所以使用字符串数组

NodeGlChild;

NodeGrChild;

Node(){

strcpP(ch,"

"

);

lChild=rChild=NULL;

}

~Node(){

if(lChild!

=NULL)

deletelChild;

if(rChild!

deleterChild;

};

staticintcount=0;

staticchararraP[MaG];

//保存原始的中缀表达式

staticcharstr[2GMaG];

//保存后序遍历出来的字符串,为表达式求值提供方便

staticintk=0;

chargetOp(NodeGtemp);

//temp指针保存每个结点,返回的是运算符

NodeGcrtTree(NodeGroot);

//传入根结点指针,返回根结点指针

voidoutput(NodeGroot);

//获得处理后的字符串

boolisError(char);

//判断字符是否有问题

voiddeal();

//对字符数组进行处理

doublevalue(string);

//计算后缀表达式,得到其结果。

intmain(){

NodeGroot=NULL;

cout<

<

输入中缀表达式:

;

cin.getline(arraP,40);

deal();

root=crtTree(root);

输出后缀表达式:

output(root);

str<

endl;

输出后缀表达式的值:

if(value(str)!

=0)

cout<

fiGed<

setprecision

(2)<

value(str)<

else

AWrongInput!

return0;

}

//将数字字符存入一个结点,并返回数字字符的后一个符号

chargetOp(NodeGtemp){

inti=0;

if(isError(arraP[count]))

eGit(0);

while(arraP[count]<

='

9'

&

arraP[count]>

0'

||arraP[count]=='

.'

){

temp->

ch[i]=arraP[count];

i++;

count++;

temp->

ch[i]='

\0'

count++;

returnarraP[count-1];

NodeGcrtTree(NodeGroot){

NodeGp,Gq;

charop;

if(root==NULL){

root=newNode;

p=newNode;

op=getOp(root);

while(op!

q=newNode;

q->

ch[0]=op;

ch[1]='

switch(op)

{

case'

+'

:

-'

q->

lChild=root;

root=q;

p=newNode;

op=getOp(p);

root->

rChild=p;

break;

G'

/'

if(root->

ch[0]=='

||root->

p=newNode;

strcpP(p->

ch,root->

ch);

p->

rChild=q;

op=getOp(root);

root=p;

}else{

q->

root=q;

op=getOp(p);

root->

}break;

('

p=root;

while(p->

rChild)

p=p->

rChild;

if(p->

lChild==NULL){

lChild=crtTree(p->

lChild);

//递归创建括号里的指针

op=arraP[count];

count++;

break;

rChild=crtTree(p->

rChild);

}

)'

returnroot;

}

returnroot;

//传入根结点,后序遍历,赋值给另一个字符数组(主要是为了给后序的计算表达式值提供方便)

voidoutput(NodeGroot){

intn;

if(root){

output(root->

n=0;

while(root->

ch[n]!

str[k++]=root->

ch[n++];

str[k++]='

'

boolisError(charch){//判断每个字符是否有错

if(ch!

ch!

!

(ch<

ch>

)&

字符错误!

returntrue;

returnfalse;

voiddeal(){//对字符数组进行处理

inti=0,n=0;

while(arraP[i]){

if(arraP[i]=='

||arraP[i]=='

i++;

arraP[n++]=arraP[i++];

arraP[n++]='

arraP[n]='

doublevalue(strings2){//计算后缀表达式,得到其结果。

stack<

double>

s;

doubleG,P;

inti=0;

while(i<

s2.length()){

if(s2[i]=='

i++;

switch(s2[i])

if(s.size()>

=2){

G=s.top();

s.pop();

G+=s.top();

break;

else

return0;

G=s.top()-G;

else

GG=s.top();

if(s.top()==0)return0;

else{

G=s.top();

G=s.top()/G;

}

default:

G=0;

while('

=s2[i]&

s2[i]<

G=GG10+s2[i]-'

i++;

if(s2[i]=='

doublek=10.0;

P=0;

while('

P+=((s2[i]-'

)/k);

i++;

kG=10;

G+=P;

if(G!

s.push(G);

if(s.size()==1)

returns.top();

return0;

六、实验结论

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

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

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

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

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