标签:strong code 等于 while 嵌套 中间 trick back return
本题考点:中缀表达式转后缀表达式。
难点:
题目描述:
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
本题的测试点如下:
输入 | 输出 | 说明 |
---|---|---|
2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + | 正常测试6种运算符 |
((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / | 嵌套括号 |
1314+25.5*12 | 1314 25.5 12 * + | 运算数超过1位整数且有非整数出现 |
-2*(+3) | -2 3 * | 运算数前有正负号 |
123 | 123 | 只有一个数字 |
我们先来说明中缀转后缀的思路:
建立一个操作符栈,用以临时存放操作符,建立一个数组或者队列,用以存放后缀表达式
括号的处理方式
那么回归到本题,本题只要我们先把中缀转成后缀,所以我们可以先不计算出每个位置具体数值,而是用字符串保存下来即可。
完整代码和注释如下:
/*
Author: Veeupup
*/
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <map>
using namespace std;
vector<string> ans;
map<char, int> priority;
string operators = "+-*/()"; // 保存所有的计算符号
void trans(string str)
{
stack<char> ops;
ops.push(‘#‘);
string tempStr;
for (int i = 0; i < str.size(); i++)
{ // 检查是否是带符号的数字
// 1. 带正负号且前一个字符为运算符(i=0时直接带正负号的也是数字)
// 2. 当前字符为数字
if( ((str[i] == ‘-‘ || str[i] == ‘+‘) && (i == 0 || string("+-/*(").find(str[i-1])!=string::npos)) || isdigit(str[i]) )
{ // 把操作数加入到后缀式中
// 如果是正号就不用加入,负号或者数字本身都要加入
tempStr = str[i] != ‘+‘ ? str.substr(i, 1) : "";
while (i + 1 < str.size() && operators.find(str[i+1]) == string::npos)
{
tempStr += str[++i];
}
ans.push_back(tempStr);
}else { // 出现操作符
if(str[i] == ‘(‘)
ops.push(str[i]);
else if(str[i] == ‘)‘) {
while (ops.top() != ‘(‘)
{
ans.push_back(string(1, ops.top()));
ops.pop();
}
ops.pop();
}else {
while (priority[str[i]] <= priority[ops.top()])
{
ans.push_back(string(1, ops.top()));
ops.pop();
}
ops.push(str[i]);
}
}
}
while (ops.size() > 1)
{
ans.push_back(string(1, ops.top()));
ops.pop();
}
}
int main()
{
priority[‘*‘] = priority[‘/‘] = 3;
priority[‘+‘] = priority[‘-‘] = 2;
priority[‘(‘] = 1;
priority[‘#‘] = 0;
string str;
getline(cin, str);
trans(str);
for (int i = 0; i < ans.size(); i++)
cout << (i ? " " : "") << ans[i];
return 0;
}
路漫漫其修远兮,吾将上下而求索。
PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)
标签:strong code 等于 while 嵌套 中间 trick back return
原文地址:https://www.cnblogs.com/veeupup/p/12623092.html