算法学习——算术表达式

题目描述:

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


题目分析:

这道题是标准算数表达式的一个变式,区别在于题目之中的有括号有省略的情况。所以整体思路为:双栈,一个栈stack放操作数,一个栈opr放操作符。

思路:遇到+ 、-、(的时候,操作符压栈opr

            遇到)的时候,从stack 和opr中弹出计算需要的操作数个数,同时把结果压栈stack,直到遇到(为止

            在计算完这一组括号了之后,持续计算,到上一个(为止,这是处理()中的数作为一个操作数的情况

            遇到数字的情况,压栈,同时计算到(为止,这是保证从左到右的运算数据

注: 也可以以后缀表达的角度来理解这道题。

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function(s) {
    var string = [];
    for(var i=0; i<s.length; i++){
        if(s[i] == ' ') continue;
        var str = "";
        while(s[i]-'0'>=0 && s[i] -'9'<=0){
           str += s[i]; 
           i++;
        }
        
        if(str.length > 0) string.push(str);
        
        s[i] && string.push(s[i]);
    }
    
   var stack = [],opr = [],i=0,len=string.length;
   while(i<len){
      if(string[i] =='+'|| string[i]== '-' || string[i] == '('){
          opr.push(string[i]);
          i++;
      }else if(string[i] == ')'){
          while(opr[opr.length-1] !== '('){
              var n2 = stack.pop(),
                  n1 = stack.pop(),
                  op = opr.pop();
                  
                  stack.push(op == '+'? n1+n2: n1-n2);
          }
          opr.pop(); // 去掉(
          
          while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的运算式都计算了
              var n2 = stack.pop(),
                  n1 = stack.pop(),
                  op = opr.pop();
                  
                  stack.push(op == '+'? n1+n2: n1-n2);
          }
          
          i++;
      }else{
          stack.push(parseInt(string[i],10));
          while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的运算式都计算了
              var n2 = stack.pop(),
                  n1 = stack.pop(),
                  op = opr.pop();
                  
                  stack.push(op == '+'? n1+n2: n1-n2);
          }
          
          i++;
          
      }
   }
   
   return stack.pop();
   
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业论文引言 随着计算机技术的发展与普及,计算机已经成为各行业最基本的工具之一,迅速进入千家万户。因此,掌握计算机应用的基本技能成为新世纪人才不可缺少的基本素质之一。为使计算机能正常工作, 除了构成计算机各个组成部分的物理设备外, 一般说来, 还必须要有指挥计算机“做什么”和“如何做”的“程序”。程序及其有关文档构成计算机软件, 其中用以书写计算机软件的语言称为计算机程序设计语言。 1 计算机程序设计语言简介 计算机程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行,通常简称为编程语言,是一组用来定义计算机程序的语法规则。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。使用程序设计语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为所有的程序都需要程序设计语言才能完成,而计算机的工作是用程序来控制的,离开了程序,计算机将一事无成。 2 开发背景及意义 现有计算器不能计算表达式,这是一个缺陷,为此,开发了一个能直接计算表达式的计算器,这为计算提高了更大的方便,可以大幅度提高计算效率。 第二章 第三章 第一节 递归下降法的描述 3.1.1实现思想 它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,其中终极符产生匹配命令,而非终极符则产生过程调用命令。因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。其中子程序的结构与产生式结构几乎是一致的。文法中每个非终结符对应一个递归过程(子程序),每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时能够按LL(1)形式可唯一地确定选择某个候选式进行推导。 3.1.2算法的特点 递归下降法是语法分析中最易懂的一种方法。递归下降法要满足的条件:假设A的全部产生式为Aα1|α2|……|αn ,则必须满足如下条件才能保证可以唯一的选择合适的产生式 predict(Aαi)∩predict(Aαj)=Φ,当i≠j. 3.1.3构造递归下降语法分析程序 采用了递归子程序方法进行语法分析,对文法中的每个非终极符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。每次进入子程序之前都预先读入一个单词。因为使用了递归下降方法,所以程序结构和层次清晰明了,易于手工实现,且时空效率较高。实际的语法分析工作,从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。 第二节

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值