算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、\
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
代码:
#include <bits/stdc++.h>
using namespace std;
int n = 0, l;
void ts(char& ch);
int cmp(char a, char b);
void p(char ch);
int main() {
string s;
getline(cin, s);
n = s.size();
stack<char> op;
for (int i = 0; i < n; i++) {
while (isdigit(s[i]) || s[i] == '.') {
if (i + 1 < n && (isdigit(s[i + 1]) || s[i + 1] == '.')) {
cout << s[i];
l++;
}
else p(s[i]);
i++;
if (i >= n) break;
}
if (i >= n) break;
if (s[i] == '(') op.push(s[i]);
else if (s[i] == ')') {
while (op.top() != '(') {
p(op.top());
op.pop();
}
op.pop();
l += 2;
}
else {
if (i == 0 || (i > 0 && s[i - 1] == '(')) {
if (s[i] == '-') cout << s[i];
l++; continue;
}
while (!op.empty() && cmp(s[i], op.top()) <= 0) {
p(op.top());
op.pop();
}
op.push(s[i]);
}
}
while (!op.empty()) {
p(op.top());
op.pop();
}
return 0;
}
void ts(char& ch) {
if (ch == '+' || ch == '-') ch = 1;
else if (ch == '*' || ch == '/') ch = 2;
else ch = 0;
}
int cmp(char a, char b) {
ts(a); ts(b);
if (a > b) return 1;
if (a == b) return 0;
if (a < b) return -1;
}
void p(char ch) {
l++;
if (l == n) cout << ch;
else cout << ch << " ";
}