中缀转后缀过程:
1. 对于数字:直接输出
2. 对于符号:
2.1 左括号:进栈
2.2 运算符号:(与栈顶符号进行优先级比较,若栈顶符号优先级低:此符号进栈;若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈)
若是乘除直接进栈;
若是加减,与栈顶比较,若栈顶是乘除,直接输出,否则进栈。
2.3 右括号:将栈顶符号弹出并输出,直到匹配左括号
遍历结束:将栈中的所有符号弹出并输出
后缀表达式的求值:
如果是数字压入栈中;如果是操作符,则从栈中退出两个操作数,运算后压入栈中;最后栈顶存放的就是计算结果。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int IsNumber(char a) {
return a >= '0'&&a <= '9';
}
int IsLeft(char a) {
return a == '(';
}
int IsRight(char a) {
return a == ')';
}
int IsPlusorMimus(char a) {
return a == '+' || a == '-';
}
int IsMultiorDivi(char a) {
return a == '*' || a == '/';
}
int main()
{
string str = "8+(3-1)*5";
stack<char> s;
int size = str.size();
char temp;
for (int i = 0; i < size; i++) {
if (IsNumber(str[i])) {
cout << str[i];
}
if (IsLeft(str[i])) {
s.push(str[i]);
}
if (IsRight(str[i])) {
while (s.size()>0) {
temp = s.top();
if (IsLeft(temp)) {
s.pop();
break;
}
else {
cout << temp;
s.pop();
}
}
}
if (IsPlusorMimus(str[i])) {
if (s.size()==0)
s.push(str[i]);
else {
temp = s.top();
if (IsMultiorDivi(temp))
cout << str[i];
else
{
s.push(str[i]);
}
}
}
if (IsMultiorDivi(str[i])) {
s.push(str[i]);
}
}
while (s.size())
{
temp = s.top();
cout << temp;
s.pop();
}
cout << endl;
system("pause");
return 0;
}