ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

150_逆波兰表达式求值

2021-12-19 23:35:23  阅读:235  来源: 互联网

标签:150 nums int equals tokens num 求值 stack 表达式


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有