zoukankan      html  css  js  c++  java
  • Lintcode: Expression Evaluation (Basic Calculator III)

    Given an expression string array, return the final result of this expression
    
    Have you met this question in a real interview? Yes
    Example
    For the expression 2*6-(23+7)/(1+2),
    input is
    
    [
      "2", "*", "6", "-", "(",
      "23", "+", "7", ")", "/",
      (", "1", "+", "2", ")"
    ],
    return 2
    
    Note
    The expression contains only integer, +, -, *, /, (, ).

    这道题其实应该算Basic Calculator III. 参考了http://blog.csdn.net/nicaishibiantai/article/details/45740649

    思路就是两个stack,一个存数字一个存符号。如果遇到数字直接存到数字stack;如果遇到符号,有几种情况:

    1.当前符号比上一个符号优先级高,比如* 高于+,那么直接进栈

    2.当前符号低于上一个,那么就要把所有已经在stack里面优先于当前符号的全算完,再推进当前符号

    3.当前符号是“(”,直接push

    4.当前符号是“)”,就要把所有“(”以前的符号全部算完

     1 public class Solution {
     2     /**
     3      * @param expression: an array of strings;
     4      * @return: an integer
     5      */
     6     public int evaluateExpression(String[] expression) {
     7         // write your code here
     8         Stack<Integer> integers = new Stack<Integer>();
     9         Stack<String> ops = new Stack<String>();
    10         int i = 0;
    11         while (i < expression.length) {
    12             String cur = expression[i];
    13             if (isOp(cur)) { // current string is an op
    14                 if (cur.equals("(")) ops.push(cur);
    15                 else if (cur.equals(")")) {
    16                     while (ops.size()>0 && !ops.peek().equals("(")) {
    17                         integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
    18                     }
    19                     ops.pop();
    20                 }
    21                 else { // +,-,*,/
    22                     while (ops.size()>0 && precede(cur, ops.peek())) {
    23                         integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
    24                     }
    25                     ops.push(cur);
    26                 }
    27             }
    28             else integers.push(Integer.parseInt(cur)); // current String is an integer, push to integer stack
    29             i++;
    30         }
    31         
    32         while (!ops.isEmpty()) {
    33             integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
    34         }
    35         return integers.isEmpty()? 0 : integers.pop();
    36     }
    37     
    38     public boolean isOp(String input) {
    39         if (input.equals("+") || input.equals("-") || input.equals("*")
    40          || input.equals("/") || input.equals("(") || input.equals(")"))
    41             return true;
    42         return false;
    43     }
    44     
    45     public int calc(int a, int b, String op) {
    46         if (op.equals("+")) return a+b;
    47         else if (op.equals("-")) return b-a;
    48         else if (op.equals("*")) return a*b;
    49         else return b/a;
    50     }
    51     
    52     public boolean precede(String a, String b) {
    53         if (b.equals("*") || b.equals("/")) return true;
    54         if (b.equals("+") || b.equals("-")) {
    55             if (a.equals("*") || a.equals("/")) return false;
    56             else return true;
    57         }
    58         return false; //case like (a+b) 到第一个+号时,+和(比应该return false
    59     }
    60 };
  • 相关阅读:
    MySQL数据库触发器
    软碟通制作fedora17 U盘启动的方法
    编译自己功能定制的Fedora7内核
    SUSE Linux 10配置裸设备(raw devices)
    linux之cut用法
    python---opencv常用函数
    vscode安装以及如何连接服务器
    pip 安装包问题汇总
    conda创建环境失败的解决方法
    git操作
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5177272.html
Copyright © 2011-2022 走看看