中缀表达式
中缀表达式 是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间
(如:3 + 4),中缀表达式是人们常用的算术表示方法。
不容易被计算机解析,但仍被许多程序语言使用,因为它符合人们的普遍用法。
与前缀或后缀记法不同的是,中缀记法中括号是必需的。计算过程中必须用括号将操作符和对应的操作数括起来,用于指示运算的次序。
后缀表达式(逆波兰表示法)
逆波兰式,也叫后缀表达式(将运算符写在操作数之后)
如:3 4 +
中缀转后缀
(1)8+4-6*2用后缀表达式表示为:
8 4 + 6 2 * -
(2)2*(3+5)+7/1-4用后缀表达式表示为:
2 3 5 + * 7 1 / + 4 -
- 遍历中缀字符串序列
- 遇到操作数则直接输出
- 遇到操作符 如栈中没有数据 直接入栈
- 栈中有数据 如优先级大于栈顶操作符 入栈
- 该操作符优先级小于或者等于栈顶操作符 则输出栈顶操作符并出栈,该操作符继续与栈顶操作符比较,直到大于栈顶操作符 入栈
- 直到遍历完,并输出完栈中数据
4 + 5 / 2 * 3 - 6
-
遇到操作数 4,输出
-
遇到操作符 + ,栈中没有数据,直接入栈
-
遇到操作数 5 ,输出
-
遇到操作符 / ,栈中有数据,比较 / 的优先级高于栈顶 +,则入栈
-
遇到操作数 2 ,输出
-
遇到操作符 * ,栈中有数据,比较 * 与栈顶操作符的优先级相同,则出栈顶操作符并输出
-
栈中有数据, * 继续与栈顶操作符继续比较,* 优先级大于 + ,则入栈
-
遇到操作数 3,输出
-
遇到操作符 - ,栈中有数据,比较 - 的优先级小与栈顶操作符,出栈顶操作符并输出。
-
栈中有数据,继续比较 - 与栈顶操作符优先级相同,则出栈顶操作符并输出
-
栈中没有数据,- 直接入栈
-
遇到操作数6,输出
-
遍历完,取出栈中操作符
- 得到后缀表达式 4 5 2 / 3 * + 6 -
后缀表达式求值
- 遍历后缀表达式字符串序列
- 遇到操作数入栈
- 遇到操作符则取两次栈顶数据出栈计算,第一次拿到的是右操作数
- 计算结果再次入栈
- 继续遍历 重复以上步骤
- 遍历完后缀表达式后,栈中剩余一个数,就是后缀表达式的计算结果
对应力扣题:逆波兰表达式求值
实现代码:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;//用来存放操作数
for(auto& str : tokens){
//1.遇到操作符 取数据计算
if(str=="+"||str=="-"||str=="*"||str=="/"){
//先取出来的是右操作数
int right=st.top();
st.pop();
int left=st.top();
st.pop();
//把计算结果再入栈
//swich不支持判断自定义类型 因为操作符string只有一个字符 所以用str[0] 拿到一个字符判断
switch(str[0]){
case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
//2.遇到操作数就入栈
else{
//string 的sting转int 接口
st.push(stoi(str));
}
}
//遍历结束返回栈中数据
return st.top();
}
};