中缀表达式转逆波兰表达式:使用栈结构
规则:
(1)运算符优先级 ( > * / > + - > (
(2)建立两个栈,分别是数字栈和运算符栈
(3)遇到数字压入数字栈
(4)遇到(或读取到的运算符 > 栈顶元素,压入运算符栈
(5)遇到)弹出运算符直到弹出(
(6)新读取到的运算符<=栈顶元素,弹出所有>=新读取到的运算符的运算符,该运算符入栈
(7)读取完毕后,将运算符栈中的运算符按顺序弹出压入到数据栈中
逆波兰表达式求值:使用栈结构
规则:遇到数字进栈,遇到运算符时,出栈两个数字进行运算,结果入栈
问题:计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","“和”/",被操作数可能是整数或其他表达式
例如:
[“2”, “1”, “+”, “3”, ""] -> ((2 + 1) * 3) -> 9↵ [“4”, “13”, “5”, “/”, “+”] -> (4 + (13 / 5)) -> 6
import java.util.*;
public class Solution {
public int evalRPN(String[] tokens) {
Stack<String> stack = new Stack();
for(int i = 0; i < tokens.length; i++){
//注意:负数也是由'-'开头
if(tokens[i].charAt(0) >= '0' && tokens[i].charAt(0) <= '9'
|| tokens[i].charAt(0) == '-'&&tokens[i].length() > 1){
stack.push(tokens[i]);
}
else{
int a = Integer.parseInt(stack.pop());
int b = Integer.parseInt(stack.pop());
int c = 0;
switch(tokens[i]){
case "+": c = b+a;break;
case "-": c = b-a;break;
case "*": c = b*a;break;
case "/": c = b/a;break;
default:
}
stack.push(String.valueOf(c));
}
}
return Integer.parseInt(stack.pop());
}
}