美文网首页
leetcode--02.后缀表达式计算

leetcode--02.后缀表达式计算

作者: yui_blacks | 来源:发表于2018-11-13 22:20 被阅读0次

题目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation
Valid operators are+,-,*,/. Each operand may be an integer or another expression.

用逆波兰式(后缀表达式)计算算术表达式的值。有效运算符是+,-,*,/。每个操作数可以是一个整数,也可以是另一个表达式。

逆波兰式:

实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中序表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

思路:

  1. 将给定的字符串数组挨个判断是否为Integer压入栈,遇到运算符时栈弹出两个数字计算,再将计算结果入栈
  2. 若是给的后缀表达式数组合理最后弹出的数字即为结果
import java.util.Stack;

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
                int num2 = stack.pop();
                int num1 = stack.pop();
                stack.push(calculate(tokens[i], num1, num2));
            } else {
                int number = Integer.parseInt(tokens[i]);
                stack.push(number);
            }
        }
        return stack.pop();
    }

    private int calculate(String operator, int a, int b) {
        switch (operator) {

        case "+":
            return a + b;
        case "-":
            return a - b;
        case "*":
            return a * b;
        case "/":
            return a / b;
        default:
            return 0;

        }
    }
}

附:
评论区看到个让人眼前一亮的方法,利用异常来做的

不过也有持不赞同的意见

老实说,异常不建议用作逻辑判断,它应该只用于检验错误,使用异常会使得运行效率变低,内部语句不会进行任何优化,《effective java》有一条就是这么写的

import java.util.Stack;

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<Integer>();
        for (int i = 0; i < tokens.length; i++) {
            try {
                int num = Integer.parseInt(tokens[i]);
                stack.add(num);
            } catch (Exception e) {
                int b = stack.pop();
                int a = stack.pop();
                stack.add(get(a, b, tokens[i]));
            }
        }
        return stack.pop();
    }

    private int get(int a, int b, String operator) {
        switch (operator) {
        case "+":
            return a + b;
        case "-":
            return a - b;
        case "*":
            return a * b;
        case "/":
            return a / b;
        default:
            return 0;
        }
    }
}

相关文章

  • leetcode--02.后缀表达式计算

    题目:Evaluate the value of an arithmetic expression in Reve...

  • day06-逆波兰表达式的计算器

    目标:完成一个逆波兰表达式的计算器(分为两个步骤)计算后缀表达式:中缀表达式转成后缀表达式: 1.计算后缀表达式:...

  • 逆波兰计算器

    中缀表达式转换成后缀表达式 后缀表达式的计算 逆波兰计算器 先挖坑,学年设计之后再来填坑。

  • 计算器

    使用Java写的一个可以计算+,-,*,/ 的计算器。首先用栈把中缀表达式转化成后缀表达式,再利用栈对后缀表达式求...

  • [堆栈] 前, 中, 后缀表达式

    将中缀表达式转换成后缀表达式(逆波兰式), 便于计算机的计算.

  • 机试常用算法和题型-栈和队列专题

    堆栈+ordermap使用括号匹配 堆栈使用简单计算器 栈+队列实现中缀转后缀,计算后缀表达式 栈+队列计算,包括...

  • 堆栈

    堆栈中常见的问题: 问题1: 后缀表达式怎么计算?问题2: 中缀表达式怎么转换成后缀表达式?问题3: 回溯算法问题...

  • Python 简单计算器-逆波兰后缀表达式实现

    中缀表达式 后缀表达式 简易计算器,可以通过栈来实现。然而如果直接使用中缀表达式,需要处理括号,而使用后缀表达式则...

  • 栈的应用

    中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算...

  • 计算器专题

    0X00 基础知识 后缀表达式的计算 150. 逆波兰表达式求值 后缀表达式就是这么简单粗暴,碰到一个符号,就从栈...

网友评论

      本文标题:leetcode--02.后缀表达式计算

      本文链接:https://www.haomeiwen.com/subject/kdrrfqtx.html