一、中缀表达式转后缀表达式
用map容器或者pair对组对运算符设定优先级
遍历字符串,数字直接加入后缀表达式字符串,否则入栈,当遇到’)'时,则必然已入左括号,此时出栈,将栈中元素加入数组中,直到遇到左括号,并将左括号pop掉
遍历完字符串后,将栈中剩余元素加入后缀字符串。
string change(string&s)
{
stack<char>st;
string res="";
unordered_map<char, int>mp;
mp['+'] = 1, mp['-'] = 1, mp['*'] = 2, mp['/'] = 2;//设置优先级
for (auto i : s)
{
if (isdigit(i))
res += i;
else
{
if (st.empty())
st.push(i);
else if (i == '(')
st.push(i);
else if (i == ')')//遇到右括号出栈
{
while (st.top() != '(')//直到匹配左括号
{
res += st.top();
st.pop();
}
st.pop();
}
else
{
while (!st.empty() && mp[i] <= mp[st.top()])
{
res += st.top();
st.pop();
}
st.push(i);
}
}
}
while (!st.empty())
{
res += st.top();
st.pop();
}
cout << res << endl;
return res;
}
二、逆波兰表达式求值
遍历后缀字符串,当遇到运算符时,取栈中数据进行相关运算并将结果入栈,其余则将字符转化为数字并入栈,栈中最后剩余的一个元素即为运算结果。
int calc(string str)
{
stack<int>s;
for (auto i : str)
{
if (i == '+' || i == '-' || i == '*' || i == '/')
{
int num1 = s.top();
s.pop();
int num2 = s.top();
s.pop();
switch (i)
{
case '+':s.push(num2 + num1); break;//注意运算顺序
case '-':s.push(num2 - num1); break;
case '*':s.push(num2*num1); break;
case '/':s.push(num2 / num1); break;
}
}
else
s.push(i-'0');
}
return s.top();
}
这里存在一个问题,仅支持个位数运算,用多位数运算需要将每个数据元素做一个字符串,
三、完整代码
#include<iostream>
#include<string>
#include<stack>
#include<unordered_map>
using namespace std;
string change(string&s)
{
stack<char>st;
string res="";
unordered_map<char, int>mp;
mp['+'] = 1, mp['-'] = 1, mp['*'] = 2, mp['/'] = 2, mp['('] = 0;
for (auto i : s)
{
if (isdigit(i))
res += i;
else
{
if (s.empty())
st.push(i);
else if (i == '(')
st.push(i);
else if (i == ')')
{
while (st.top() != '(')
{
res += st.top();
st.pop();
}
st.pop();
}
else
{
while (!st.empty() && mp[i] <= mp[st.top()])
{
res += st.top();
st.pop();
}
st.push(i);
}
}
}
while (!st.empty())
{
res += st.top();
st.pop();
}
cout << res << endl;
return res;
}
int calc(string str)
{
stack<int>s;
for (auto i : str)
{
if (i == '+' || i == '-' || i == '*' || i == '/')
{
int num1 = s.top();
s.pop();
int num2 = s.top();
s.pop();
switch (i)
{
case '+':s.push(num2 + num1); break;
case '-':s.push(num2 - num1); break;
case '*':s.push(num2*num1); break;
case '/':s.push(num2 / num1); break;
}
}
else
s.push(i-'0');
}
return s.top();
}
int main()
{
string str;
cin >> str;
cout << calc(change(str));
}