表达式转换
题目难度: ☀️
题目类型: 栈
题目描述:
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、/
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、/
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
解题思路:
有数字直接输出,注意小数、负数、正数的区别对待。用一个help栈来模拟运算符的优先级,优先级大的先输出,即压入栈顶。用map来存储运算符的优先级更方便。
以下是完整AC代码:
#include<iostream>
#include<map>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
stack<char> help;
map<char, int> prio;
prio['+'] = 1; prio['-'] = 1;
prio['*'] = 2; prio['/'] = 2;
prio['('] = 3; prio[')'] = 3;
// help栈存储运算符,prio表示运算符的优先级
string str;
cin >> str;
int len = (int)str.size();
int flag = 0;
// flag标记第一个数字,若是第一个数字,则输出前不加空格
for (int i = 0; i < len; i++) {
if (((!i || str[i - 1] == '(') && (str[i] == '+' || str[i] == '-'))
|| (str[i] >= '0' && str[i] <= '9')
|| str[i] == '.') {
// 考虑负数,正数和小数
if (flag) cout << " ";
if (str[i] != '+') cout << str[i];
while (str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9')) {
i++; cout << str[i];
}
flag = 1; // 第一个数字输出后立刻标记
}
else {
if (str[i] == ')') {
while (!help.empty() && help.top() != '(') {
cout << " " << help.top();
help.pop();
}
help.pop();
// 弹出'(',括号不输出
}
else if (help.empty() || (prio[str[i]] > prio[help.top()])) {
help.push(str[i]);
}
// 运算符优先级高的先输出,所以入栈
else {
while (!help.empty() && help.top() != '('){
cout << " " << help.top();
help.pop();
}
// 运算符小于等于栈顶元素,就输出
help.push(str[i]);
}
}
}
while (!help.empty()) {
cout << " " << help.top();
help.pop();
}
// 将栈内的元素全部输出
return 0;
}