7-1 表达式转换 (25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
Accepted Code
#include <iostream>
#include <stack>
#include <map>
#include <string>
#include <cctype>
#include <cstdio>
#include <cstdlib>
using namespace std;
stack<char> S1;
map<char, int> M;
int main() {
M['+'] = M['-'] = 1;
M['*'] = M['/'] = 2;
string s;
cin >> s;
bool Tmp = true; //控制格式
for (int i = 0; s[i]; ++i) {
//判断数字及特殊情况
//判断s[i]为整数,为小数点,以及跟正负号与数字一起输出有关的两种特殊情况
if ((isdigit(s[i]) || s[i] == '.') || ((i == 0 || s[i - 1] == '(') && (s[i] == '+' || s[i] == '-'))) {
if (!Tmp) {
cout << ' ';
}
//负数时直接输出负号,正数则不用
if (s[i] != '+') {
cout << s[i];
}
//如果是小数就继续往后读
while (s[i + 1] == '.' || isdigit(s[i + 1])) {
cout << s[++i];
}
Tmp = false;
} else { //为运算符时
//左括号压入栈中
if (s[i] == '(') {
S1.push(s[i]);
} else if (s[i] == ')') {
//右括号:将栈顶的运算符弹出并输出,直到遇到左括号
while (!S1.empty() && S1.top() != '(') {
cout << " " << S1.top();
S1.pop();
}
S1.pop();
} else if (S1.empty() || (M[s[i]] > M[S1.top()])) {
//s[i]的优先级比栈顶元素的大
S1.push(s[i]);
} else {
//s[i]的优先级小于等于栈顶元素
while (!S1.empty() && S1.top() != '(') {
cout << ' ' << S1.top();
S1.pop();
}
S1.push(s[i]);
}
}
}
while(!S1.empty()) {
cout << " " << S1.top();
S1.pop();
}
return 0;
}
仅供参考