根据中缀表达式求出后缀表达式,并计算后缀表达式的值;
中缀转后缀
以2+(4+6)/2 + 6/3为例,计算过程如下:
实现逻辑
bool Priority2(char ch, char chtop)
{
if ((ch == '*' || ch == '/') && (chtop == '+' || chtop == '-')) // 当前符号大于栈顶符号
{
return true;
}
if (chtop == '(')
{
return true;
}
return false;
}
string MidToEnd(string exp)
{
string result; // 存放后缀表达式
stack<char> stchar; // 字符栈
for (char ch : exp)
{
if (ch > '0' && ch < '9') // 如果是数字
{
result.push_back(ch);
}
else // 如果是符号
{
if (ch == '(' || stchar.empty())
{
stchar.push(ch);
}
else if (ch == ')') // 遇到 ) ,一直出栈,直到 )为止。
{
while (stchar.top() != '(')
{
char c = stchar.top();
result.push_back(c);
cout << c << endl;
stchar.pop();
}
stchar.pop();
}
else
{
char ctop = stchar.top(); // 栈顶符号
if (Priority2(ch, ctop)) // 用当前符号和栈顶符号进行比较
{
// 当前符号大于栈顶符号,当前直接入栈
stchar.push(ch);
}
else
{
// 当前符号小于等于栈顶符号,出栈,直到栈为空
while (!stchar.empty())
{
char c = stchar.top();
result.push_back(c);
cout << c << endl;
stchar.pop();
}
stchar.push(ch);
}
}
}
}
// 最后输出栈中元素
while (!stchar.empty())
{
char ch = stchar.top();
result.push_back(ch);
stchar.pop();
}
return result;
}
后缀表达式(逆波兰表达式)求值
代码实现逻辑:
遍历字符串数组中每个元素,并判断是否为数字或符号
如果是符号:+ - * / 符号
先从栈中取出元素作为右操作数,再从栈中取出元素作为左操作数,进行运算符。
如果是数字,进行stoi(str)转换,并保存在栈中。
int calc(int left,int right,char sign)
{
switch (sign)
{
case '+':
return left + right;
case '-':
return left - right;
case '*':
return left * right;
case '/':
return left / right;
}
throw "";
}
int evalRPN(vector<string>& tokens) {
stack<int> intStack;
for (string &str : tokens)
{
if (str.size() == 1 && (str[0] == '+' || str[0] == '*' || str[0] == '-' || str[0] == '/'))
{
if(intStack.empty())
{
continue;
}
// 遇到运算符了,开始运算
// 先取出右操作数,再左操作数
int right = intStack.top();
intStack.pop();
int left = intStack.top();
intStack.pop();
int result = calc(left,right,str[0]);
intStack.push(result);
}
else
{
// 遇到数字,直接入数字栈
// string => int stoi stol stof
// int => string to_string()
intStack.push(stoi(str));
}
}
return intStack.top();
}