• [LeetCode][JavaScript]Basic Calculator


    Basic Calculator

    Implement a basic calculator to evaluate a simple expression string.

    The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

    You may assume that the given expression is always valid.

    Some examples:

    "1 + 1" = 2
    " 2-1 + 2 " = 3
    "(1+(4+5+2)-3)+(6+8)" = 23

    Note: Do not use the eval built-in library function.

    https://leetcode.com/problems/basic-calculator/


    这这这不是我每天都为之纠结的后缀表达式吗。

    题目比较简单只有加减法,而且没有算上负数。

    我赌5毛,将来会有一道hard就是这题带上负数,小数,大小括号,乘除法之类,名字我都起好了Basic Calculator II。

    2个栈,第一个是放运算结果(或者中间运算结果)的栈resultStack,第二个是放运算符的栈opStack。

    举栗子:1+2

    1 --> resultStack : [1], opStack : []

    + --> resultStack : [1], opStack : [+]

    2 --> resultStack : [1,2], opStack : [+]

    压缩二元运算操作compress_2operators() --> resultStack : [3], opStack : []

    结束

    举栗子2: 3-(2-1)

    3 --> resultStack : [3], opStack : []

    - --> resultStack : [3], opStack : [-]

    ( --> resultStack : [3], opStack : [-,(]

    2 --> resultStack : [3,2], opStack : [-,(]

    - --> resultStack : [3,2], opStack : [-,(,-]

    1 --> resultStack : [3,2,1], opStack : [-,(,-]

    ) --> 压缩括号操作compress_bracket(),中间会调用compress_2operators() --> resultStack : [3,1], opStack : [-]

    压缩二元运算操作compress_2operators() --> resultStack : [2], opStack : []

    结束

    如果要加上乘除法,需要修改一下正则,加上乘除法和加减法的优先级。

     1 /**
     2  * @param {string} s
     3  * @return {number}
     4  */
     5 var calculate = function(s) {
     6     var resultStack = [];
     7     var opStack = [];
     8     var temp = "";
     9     for(var i = 0; i < s.length; i++){
    10         var ch = s[i];
    11         if(/^(+|-)$/.test(ch)){ // + -
    12             compress_2operators();
    13             opStack.push(ch);
    14         } else if (ch === '('){
    15             opStack.push(ch);
    16         } else if (ch === ')'){
    17             compress_bracket();
    18         } else if (/^[0-9]$/.test(ch)){
    19             temp += ch;
    20         }
    21 
    22         if(s[i + 1] && /^(+|-|(|))$/.test(s[i + 1])){ // + - ( )
    23             if(temp !== ""){
    24                 resultStack.push(parseInt(temp));
    25                 temp = "";
    26             }
    27         }
    28     }
    29     if(temp !== ""){
    30         resultStack.push(parseInt(temp));
    31         temp = "";
    32     }
    33     compress_2operators();
    34     return resultStack.pop();
    35 
    36     function compress_bracket(){
    37         while(opStack[opStack.length - 1] !== '('){
    38             compress_2operators();
    39         }
    40         opStack.pop(); //(
    41     }
    42     function compress_2operators(){
    43         while(/^(+|-)$/.test(opStack[opStack.length - 1])){ // + -
    44             var op = opStack.pop();
    45             var right = resultStack.pop();
    46             var left = resultStack.pop();
    47             if(op === '+'){
    48                 resultStack.push(left + right);
    49             }else{
    50                 resultStack.push(left - right);
    51             }
    52         }
    53     }
    54 };
  • 相关阅读:
    兼容ie6浏览器窗口四角固定背景代码
    实用的js判断浏览器类型及版本
    测试
    C#动态获取鼠标位置的颜色
    对指定的网页进行截图
    C#中使用 SendMessage 向非顶端窗体发送组合键
    ProtelDXP练习作品51单片机最小系统
    对非顶端窗口截图
    C#直接操作并口
    单片机实现的数字钟
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4564877.html
Copyright © 2020-2023  润新知