中缀表达式转后缀表达式
简单介绍
中缀表达式是我们熟悉的表达式,如1 - 2 + 3 * (4 / 2)
而后缀表达式(也叫逆波兰表达式)是方便计算机运算的表达式,如1 2 - 3 4 2 / * +
为了方便写程序计算,我们通常把中缀表达式转换成后缀表达式,其运用的思想就是栈了
算法实现
我们用一个栈来调整运算符之间的先后顺序
1.数字没有先后关系直接添加到后缀表达式中
2.+ - 优先级最低,碰到时先让栈里元素出栈添加到后缀表达式中直到栈为空或栈顶元素为 ( 时再入栈
3.* / 优先级较高可以直接进栈
4.( 优先级较高也可以直接进栈
5.) 表示括号内的运算符处理完成,将栈里元素出栈添加到后缀表达式直到 ( 出栈为止
6.重复1~5步骤直到中缀表达式转换完成
具体代码见实现代码中的transform函数
实现代码
#include <bits/stdc++.h>
using namespace std;
string transform(string str)
{
string::iterator it = str.begin();
stack<char> s;
string expression;
while (it != str.end())
{
int element = 0;
if (isdigit(*it))
{
while (isdigit(*it))//将多个连续的数字字符拼接成一个整数
{
element *= 10;
element += (*it - '0');
it++;
}
expression.push_back(element);
continue;
}
else if (*it == '+' || *it == '-')
{
while (!s.empty() && s.top() != '(')
{
expression.push_back(s.top());
s.pop();
}
s.push(*it);
}
else if (*it == '*' || *it == '/' || *it == '(')
{
s.push(*it);
}
else if (*it == ')')
{
while (s.top() != '(')
{
expression.push_back(s.top());
s.pop();
}
s.pop();
}
it++;
}
while (!s.empty()) //处理完成后将栈中元素一个个出栈添加到后缀表达式中
{
expression.push_back(s.top());
s.pop();
}
return expression;
}
bool isOperation(char it) //判断是否为运算符
{
if (it == '+' || it == '-' || it == '*' || it == '/')
return true;
else
return false;
}
int getResult(int a, int b, char operation) //得出运算结果
{
if (operation == '+')
{
return a + b;
}
else if (operation == '-')
{
return a - b;
}
else if (operation == '*')
{
return a * b;
}
else if (operation == '/')
{
return a / b;
}
}
int calculate(string expression)
{
string::iterator it = expression.begin();
stack<int> s;
while (it != expression.end())
{
int a, b;
if (isOperation(*it))
{
b = s.top(); // 注意两个数的先后顺序
s.pop();
a = s.top();
s.pop();
s.push(getResult(a, b, *it));
}
else
{
s.push(*it);
}
it++;
}
return s.top();
}
int main()
{
string str;
cin >> str;
cout << calculate(transform(str)) << endl;
}
来源:CSDN
作者:南极墨白
链接:https://blog.csdn.net/qq_43542311/article/details/104178835