中缀表达式转换为后缀表达式c++b编程Word文档格式.docx
《中缀表达式转换为后缀表达式c++b编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《中缀表达式转换为后缀表达式c++b编程Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
在分开存储中缀表达式的运算符和数字的voidanalysis(charpost[100],wordm_word[100])函数中
charpost[100]存放中缀表达式
wordm_word[[100]结构体类型的数组可以区分多位数,小数,运算符
doublesum由字符转换后的多位数或小数
依次扫描中缀表达式的字符,若连续的为一串数字,则将他们转换为多位数,存放于word类型的m_word数组中并且型为num下,所下标对应的型为type置‘0’,若为操作符,则直接存于m_word数组中并且型为type下。
在表达式转换voidExchange(worda[100],wordb[100],intm,int&
l)函数中
worda[100]存放的是中缀表达式
wordb[100]存放转换后的后缀表达式
intm标记数组a中元素个数
intl标记数组b中元素个数
STACKO临时存放运算符(+-*/)并对其进行相应的入栈出栈弹栈操作
在求值doubleAdd(wordpost[100],intl)函数中
wordpost[100]后缀表达式结构体数组
intl记录数组长度
STACKS将后缀表达式的数字按某种方式压入此栈,经过运算后弹出最后一个元素即为所求的值
1.逻辑设计:
(1)输入中缀表达式
2.借助analisis,将输入的单一字符变为相应的整数和小数,存放在一结构体数组中,此数组可区分数和操作符
3.将中缀表达式转换为后缀表达式需要借助于一个栈来存放操作符,具体方法如下:
①从左到右一次扫描中缀表达式的每一个字符,如果为多位数或浮点数,则直接将它们写入后缀表达式中。
②如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。
③如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:
●1、当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表式,
并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级;
●2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入栈中。
④重复上述步骤,直到将中缀表达式扫描完毕,最后弹出栈中的所有元素并放入后缀表达式中,转换结束。
(3)求后缀表达式式的值,将后缀表达式中的数字直接压入新栈中,若为运算符,则将栈顶元素和次栈顶元素做相应的运算,则新栈中存储的最后一个值为我们所求的表达式的结果。
流程图见下页:
主程序的流程图为:
中缀表达式的等价转换analysis函数流程图:
中缀表达式转换为后缀表达式的Exchange函数流程图:
根据后缀表达式求值Add函数流程图:
四.测试结果
五.系统不足与经验体会
1当输入除数为零时,系统会自动报错,但在程序中并未有报错语句,应该在后期加以改进
2熟练掌握栈的各种操作,是写好本次试验的前提条件
3后期学习中应该加强动手能力,多上机操作试验,因为你永远想不到自己所写的程序会发生什么样的错误
六,附录(源代码,带注释)
#include<
iostream>
usingnamespacestd;
#definemaxlength100
structword//定义word结构体类型,其中包含两个变量
{
chartype;
doublenum;
};
structSTACK{//定义栈的结构体类型
inttop;
wordelements[maxlength];
voidMakeNull(STACK&
S)//初始化栈
S.top=maxlength;
}
boolEmpty(STACKS)//判栈空
if(S.top>
maxlength-1)
return1;
else
return0;
wordTop(STACKS)//弹出栈顶元素
wordempty={'
0'
0};
if(Empty(S))
returnempty;
return(S.elements[S.top]);
wordPop(STACK&
S)//删除栈顶元素
{
std:
:
cerr<
<
"
栈空不能出栈"
;
}
returnS.elements[S.top++];
voidPush(wordx,STACK&
S)//将元素压入栈中
if(S.top==0)
栈满不能入栈"
S.top=S.top-1;
S.elements[S.top]=x;
wordDisplay(STACKS)
cout<
栈中元素有"
while(!
Empty(S))
empty=Pop(S);
empty.type;
endl;
wordiDisplay(STACKS)
empty.num;
voidExchange(worda[100],wordb[100],intm,int&
l)
{//将中缀表达式转换为后缀表达式
STACKO;
//定义空栈O
MakeNull(O);
inti;
for(i=0;
i<
m;
i++)
if(a[i].type=='
)//如果为数字时
{
b[l]=a[i];
//直接存入后缀表达式数组
l++;
}
if(a[i].type=='
('
)
Push(a[i],O);
Display(O);
if(a[i].type=='
+'
||a[i].type=='
-'
while(!
Empty(O)&
&
Top(O).type!
='
{
b[l++]=Pop(O);
}
Push(a[i],O);
/'
*'
)'
while(Top(O).type!
Pop(O);
Empty(O))//当栈非空时,弹出栈顶元素存入后缀表达式数组
b[l++]=Pop(O);
intj;
for(j=0;
j<
l;
j++)//输出后缀表达式数组
if(b[j].type=='
cout<
b[j].num<
"
else
b[j].type;
doubleAdd(wordpost[100],intl)//求和
STACKS;
MakeNull(S);
for(inti=0;
if(post[i].type=='
)//为数字时
Push(post[i],S);
iDisplay(S);
doublea,b;
a=Pop(S).num;
b=Pop(S).num;
wordc;
c.type='
switch(post[i].type)
case'
c.num=b+a;
break;
case'
c.num=b-a;
c.num=b*a;
c.num=b/a;
default:
break;
Push(c,S);
doubleresult=Pop(S).num;
returnresult;
voidanalysis(charpost[100],wordm_word[100])
{//将中缀表达式转换为等价的中缀表达式
inti=0,j=0;
doublesum;
while(post[i]!
#'
sum=0;
if(post[i]>
post[i]<
9'
while(post[i]>
sum*=10;
sum+=(double)(post[i]-'
);
//按多位数存储
i++;
if(post[i]=='
.'
floatk=10.0;
while(post[i]>
)//按小数存储
{
sum+=(double)(post[i]-'
)/k;
i++;
k*=10.0;
}
m_word[j].type='
m_word[j].num=sum;
j++;
m_word[j].type=post[i];
i++;
j++;
intmain()
{doubler;
charmid[100];
wordm_word[100];
inti=0,m=0;
请输入中缀表达式"
while(cin>
>
mid[i])
if(mid[i]=='
break;
m++;
输入的中缀表达式为"
cout<
mid[i];
analysis(mid,m_word);
wordpost[100];
intl=0;
转换后的后缀表达式为\n"
Exchange(m_word,post,m,l);
运算结果为\n"
r=Add(post,l);
r<