后缀表达式转换成中缀表达式
发布网友
发布时间:2022-04-25 22:42
我来回答
共1个回答
热心网友
时间:2022-06-18 07:41
#include <iostream>
#include <stack>
using namespace std;
bool isNum(char c)
{
if(c>='0'&&c<='9') return true;
else return false;
}
int priority(char op)
{
switch(op)
{
case'=':return(1);
case')':return(2);
case'+':
case'-':return(3);
case'*':
case'/':return(4);
case'(':return(5);
default:return(0);
}
}
void infix_exp_value(char *infixexp,char *postfixexp)
{
stack<char> s;
char cur_char,topElement;
s.push('#');
cur_char = *infixexp;
while(s.top()!='#' || cur_char!='#')//当栈空 且 前缀表达式结束时 停止循环
{
if (isNum(cur_char))
{
*postfixexp = cur_char;
postfixexp++;
cur_char = *(++infixexp);
}
else
{
if (s.top()=='('||priority(s.top()) < priority(cur_char))
{
s.push(cur_char);
cur_char=*(++infixexp);
}
else
{
topElement = s.top();
s.pop();
*postfixexp=topElement;
postfixexp++;
}
}
}
*postfixexp='#';
*(++postfixexp)='\0';
}
void main()
{
char pre[40],post[40];
cin>>pre; //表达式需以#收尾
infix_exp_value(pre,post);
cout<<post;
}
这个算法太过简易,没办法识别非法表达式,没办法区分两个相邻的数字,不支持表达式中的空格输入,不支持浮点数
尤其是输入表达式必须使用#结尾
这个是完全按你的要求修改的,我还用面向对象另写了一个程序,能完成上述没有的功能,并能进行求值,你要想要可以Hi我