150_逆波兰表达式求值
package 栈; import java.util.Deque; import java.util.LinkedList; import java.util.Stack; /** * https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/ * @author Huangyujun * * 后缀表达式: * 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素), * 并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果 */ /** * 题意:给的逆波兰表达式就只有 数字和运算符呀, * 所以自己写一个方法判断是否非数字即可呀 * @author Huangyujun * */ class Solution { public int evalRPN(String[] tokens) { Deque<Integer> stack = new LinkedList<Integer>(); int n = tokens.length; for (int i = 0; i < n; i++) { String token = tokens[i]; if (isNumber(token)) { stack.push(Integer.parseInt(token)); } else { int num2 = stack.pop(); int num1 = stack.pop(); switch (token) { case "+": stack.push(num1 + num2); break; case "-": stack.push(num1 - num2); break; case "*": stack.push(num1 * num2); break; case "/": stack.push(num1 / num2); break; default: } } } return stack.pop(); } public boolean isNumber(String token) { return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token)); } } //public class _150_逆波兰表达式求值 { // public int evalRPN(String[] tokens) { // Stack<String> num_stack = new Stack<String>(); // Stack<String> opt_stack = new Stack<String>(); //// int state = 0; //// final int num_state = 1; //// final int opt_state = 2; // String[] nums = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; //// String[] opts = {"+", "-", "*", "/"}; // //因为题意给的是合法的表达式:(一开始先遇到的是数字, 但是后边突然是字符串呀,所以需要修改一下判断条件) // //使用char 判断吧 // for(int i = 0; i < tokens.length; i++) { //// for(String num : nums) { //// if(tokens[i].equals(num)) { //某个数字 //// num_stack.push(tokens[i]); ////// state = num_state; //// break; //// } //// } // //这个判断条件不对,因为数字可能有负数,超过 0 到 9 的数呀 // if(nums[0].equals(tokens[i]) || nums[1].equals(tokens[i]) || nums[2].equals(tokens[i]) || // nums[3].equals(tokens[i]) || nums[4].equals(tokens[i]) || nums[5].equals(tokens[i]) || // nums[6].equals(tokens[i]) || nums[7].equals(tokens[i]) || nums[8].equals(tokens[i]) || // nums[9].equals(tokens[i]) ) { // num_stack.push(tokens[i]); // }else { // opt_stack.push(tokens[i]); //题意提示总是有效了 // if(num_stack.size() < 2) { // continue; // }else { // int num2 = Integer.parseInt(num_stack.pop()); // int num1 = Integer.parseInt(num_stack.pop()); // String opt = opt_stack.pop(); // if(opt.equals("+")) { // num_stack.push(Integer.toString(num1 + num2)); // }else if(opt.equals("-")) { // num_stack.push(Integer.toString(num1 - num2)); // }else if(opt.equals("*")) { // num_stack.push(Integer.toString(num1 * num2)); // }else { // num_stack.push(Integer.toString(num1 / num2)); // } // } // } // } // return Integer.parseInt(num_stack.peek()); // } //}