Time Limit: 1sec Memory Limit:256MB
Description
将中缀表达式(infix expression)转换为后缀表达式(postfix expression)。假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含双目算术操作符+,-,*,/和%。
Input
表示中缀表达式的一个字符串(其中只包含操作数和操作符,不包含任何其他字符)
Output
表示对应后缀表达式的一个字符串(其中只包含操作数和操作符,不包含任何其他字符)
Sample Input
Sample Output
Problem Source: demo test
#include <iostream>
#include <string>
#include <stack>
using namespace std;
bool isoper(char a) {
if(a =='+'||a =='-'||a =='*'||a =='/'||a =='%')
return true;
else return false;
}
int rank(char a) {
if(a =='*'||a =='/'||a =='%')
return 3;
else return 1;
}
int main() {
stack<char> op;
string str;
cin >> str;
int l = str.length();
for(int i = 0; i < l; i++) {
if(!isoper(str[i])) {
cout << str[i];
} else {
if(op.empty()) {
op.push(str[i]);
} else {
while(!op.empty()&&rank(op.top()) >= rank(str[i])) {
cout << op.top();
op.pop();
}
op.push(str[i]);
}
}
}
while(!op.empty()) {
cout << op.top();
op.pop();
}
}
基本算法,利用栈:
中缀表达式转后缀表达式的算法较为简单,采用栈来实现。规则如下:<span style="font-family:Microsoft YaHei;font-size:18px;">遇到数字:直接输出
遇到'(':压栈
遇到')':持续出栈,如果出栈的符号不是'('则输出,否则终止出栈。
遇到符号则判断该符号与栈顶符号的运算优先级,如果栈顶符号的运算优先级高,则出栈并输出,直到优先级相等或栈为空;如果栈顶符号的运算优先级低于当前符号的运算优先级,则将当前符号压栈。
处理完字符串后将栈中剩余的符号全部输出。</span>