其他分享
首页 > 其他分享> > 150_逆波兰表达式求值

150_逆波兰表达式求值

作者:互联网

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());
//    }
//}

 

标签:150,nums,int,equals,tokens,num,求值,stack,表达式
来源: https://www.cnblogs.com/shan333/p/15709105.html