算法思想:
从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和小数点“.”则直接将它们写入后缀表达式中,否则(遇到的是操作符)转2或3。
如果遇到的括号时:
2.1.如果是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始;
2.2.如果遇到的括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。如果遇到的是操作符,则将该操作符和操作符栈顶元素比较:
3.1 当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取出栈顶元素放入后缀表式, 并弹出该栈顶元素,反复执行直到栈顶元素的优先级小于当前操作符的优先级,然后将该元素压倒栈中;
3.2、当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它直接压入栈中。重复上述步骤直到遇到中缀表达式的结束符,弹出栈中的所有元素并放入后缀表达式中,转换结束。
代码实现:
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
int prior(char x);
int main()
{
string input, output;
stack<char> sym;
while(cin >>input){
for (size_t i = 0; i <input.length(); i++)
{
char tmp = input[i];
int val = prior(tmp);
if (val == -2) cout << tmp;
else{
if (sym.empty()==true)sym.push(tmp);
else {
if (tmp=='(')
{
sym.push(tmp);
continue;
}
if (tmp ==')') {
while (sym.top() != '(') { cout<<sym.top(); sym.pop(); }
sym.pop();
continue;
}
if (val <=(prior(sym.top())))
{
while ((sym.empty() == false) &&( sym.top()!='(')&&( val <=prior(sym.top())))
{
char x = sym.top();
cout << x;
sym.pop();
}
}
sym.push(tmp);
continue;
}
}
}
}
while (sym.empty() == false)
{
char x = sym.top();
sym.pop();
cout << x;
}
cout << endl;
return 0;
}
int prior(char x)
{
char add = '+', sub = '-', mutil = '*', div = '/', left = '(', right = ')',equal='=';
if (x == equal) return -1;
if (x == add) return 0;
if (x == sub) return 0;
if (x == mutil) return 1;
if (x == div) return 1;
if (x == left) return 2;
if (x == right) return 2;
return -2;
}