逆波兰表达式(Reverse Polish Notation,RPN),又称为后缀表达式,是一种特殊的算术表达式形式。
以中缀表达式“(a+b)*(c+d)”为例,其逆波兰表达式为“ab+cd+*”。具体转换过程如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> number;
int right, left;
for (auto it : tokens)
{
if (isdigit(it.back()))
{
number.push(stoi(it.c_str()));
}
else
{
right = number.top();
number.pop();
left = number.top();
number.pop();
switch (it[0])
{
case '+':
number.push(right + left);
break;
case '-':
number.push(left - right);
break;
case '*':
number.push(right * left);
break;
case '/':
number.push(left / right);
break;
}
}
}
return number.top();
}
};
波兰表达式,也被称为前缀表达式,是一种数学表达式的表示方法。它由波兰逻辑学家J.Lukasiewicz于1929年提出,旨在简化逻辑学和数学中表达式的描述和处理。
与中缀表达式相比,波兰表达式和后缀表达式的好处在于没有括号,因此在计算时无需考虑优先级,这能够提高计算机的运算效率。
1.建立一个栈 2.遇到运算符,如果栈为空或当前运算符高于栈顶运算符优先级,入栈 3.遇到运算符,如果栈不为空且当前运算符低于或等于栈顶运算符优先级,出栈 4.结束时,全部出栈
class Solution {
public:
void toRPN(const string& s, size_t& i, vector<string>& v)
{
stack<char> st;
while (i < s.size())
{
if (isdigit(s[i]))
{
string num;
while (i < s.size() && isdigit(s[i]))
{
num += s[i];
i++;
}
v.push_back(num);
}
else if(s[i] == '(')
{
i++;
toRPN(s, i, v);
}
else if(s[i] == ')')
{
while (!st.empty())
{
v.push_back(string(1, st.top()));
st.pop();
}
i++;
return;
}
else
{
if (st.empty() || ((s[i] == '*' || s[i] == '/') && (st.top() != '*' || st.top() != '/')))
{
st.push(s[i++]);
}
else
{
v.push_back(string(1, st.top()));
st.pop();
}
}
}
while (!st.empty())
{
v.push_back(string(1, st.top()));
st.pop();
}
}
int evalRPN(vector<string>& tokens) {
stack<int> number;
int right, left;
for (auto it : tokens)
{
if (isdigit(it.back()))
{
number.push(stoi(it.c_str()));
}
else
{
right = number.top();
number.pop();
left = number.top();
number.pop();
switch (it[0])
{
case '+':
number.push(right + left);
break;
case '-':
number.push(left - right);
break;
case '*':
number.push(right * left);
break;
case '/':
number.push(left / right);
break;
}
}
}
return number.top();
}
int calculate(string s) {
size_t i = 0;vector<string> v;
string ne;
//去空格
for (auto it : s)
{
if (it != ' ')
ne.push_back(it);
}
s.clear();
//去负数
for (int n = 0; n < ne.size(); n++)
{
if (ne[n] == '-' && ( n == 0 ||(!isdigit(ne[n-1])&&s[n-1] != ')')))
{
s += "0-";
}
else
{
s.push_back(ne[n]);
}
}
toRPN(s, i, v);
for (auto& e : s)
{
cout << e << " ";
}
return evalRPN(v);
}
};
思路很简单 把括号内的 + 变 - -变+ 即可 不需要递归了
因为中值表达式 可以在思路B的基础上 不进行变换 直接进行优先级运算