算术表达式中的简单算术表达式,由中缀转为后缀的方法:将中缀表达式exp转化为后缀表达式postexp的过程如下
while(从exp中读取字符ch,ch!=‘\0')
{
若ch是数字,将后继的数字均依次存放到postexp之中,并以字符“#”标志数值串结束;
若ch为左括号,将此括号进栈到op之中;
若ch为右括号,将op栈中的左括号之前的运算符全部依次退栈并放入postexp之中,将左括号删除;
若ch的运算符优先级不大于运算符栈op栈顶运算符(除栈顶运算符为“(”外)的优先级,则依次出栈并存入到postexp中,将ch进栈;
}
若字符串扫描完毕,则将运算符op中的所有运算符依次出栈并放入postexp中即可。
具体代码实现如下:
#include <iostream>
#include <stack>
using namespace std;
stack<char> op;
void trans(char exp[], char postexp[])
{
char ch;
int i = 0, j = 0;
ch = exp[i]; i++;
while (ch != '\0')
{
switch (ch)
{
case '(':
op.push(ch);
break;
case ')':
while (op.top() != '(')
{
postexp[j] = op.top(); j++;
op.pop();
}
op.pop();
break;
case '+':
case '-':
while (!op.empty()&&op.top()!='(')
{
postexp[j] = op.top();
j++;
op.pop();
}
op.push(ch);
break;
case '*':
case '/':
while (!op.empty() && op.top() != '(' && (op.top() == '*' || op.top() == '/'))
{
postexp[j] = op.top();
j++;
op.pop();
}
op.push(ch);
break;
case ' ':
break;
default:
while (ch >= '0'&&ch <= '9')
{
postexp[j] = ch;
j++;
}
i--;
postexp[j] = '#'; j++;
}
ch = exp[i]; i++;
}
while (!op.empty())
{
postexp[j] = op.top();
j++;
op.pop();
}
postexp[j] = '\0';
}