全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript数据结构中栈的应用之表达式求值问题详解

本文实例讲述了JavaScript数据结构中栈的应用之表达式求值问题。分享给大家供大家参考,具体如下:

下面来谈一个比较经典的表达式求值问题,这个问题主要是设计到操作符的优先级。我们通常看到的表达式都是中缀表达式,存在很多优先级差别,而后缀表达式则没有这些优先级问题。下面先看看两种表达式的区别。

     中缀表达式:a*b+c*d-e/f
     后缀表达式:ab*cd*+ef/-

从中缀表达式转换到后缀表示式是很难实现的,我们这里可以通过栈的思想来实现。下面进行详细的介绍是什么样的思想:

在对一个中缀表示式进行转换的时候,遇到非操作符的字符则直接保存到后缀表示式的存储空间中。

遇到(,则压入栈,只有遇到对应的)才能被弹出。
遇到),就将(之前的操作符全部弹出,并保存到存储空间。
遇到*和/这样优先级高的,就判断栈中的操作符优先级是否低于当前操作符。
如果栈中的遇到的低,则将遇到的继续入栈;如果栈中的高,则将栈中的出栈,遇到的入栈。
最后,当字符串遍历完成,依次弹出操作符,保存到存储空间。

为了方便理解,将上面的例子再次讲解。a*b+c*d-e/f

首先是ab被保存到了存储空间,然后*入栈。现在栈中只有*。
遇到+之后,由于*比+优先级高,所以*出栈,+入栈,这样存储空间变为ab*,栈中变为+。
再时候遇到c,存储空间变为ab*c,栈中还是+。
接下来遇到*和d,由于+比*低,所以*继续入栈,栈中表为了+*,存储空间为ab*cd。
之后遇到-,由于*比-高,所以+*出栈,-入栈,存储空间变为ab*cd*+
……后面不用解释了,悟性再低也应该会了。

下面我们用JavaScript代码来实现下吧。

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
<script type="text/javascript">
 function midTOLast(a){
  var a_len=a.length;
  var myArray=new Array();
  b='';
  for(var i=0;i<a_len;i++){
   switch (a[i]){
    case '(':
    {
     myArray.push(a[i]);
     break;
    }
    case ')'://如果是)则将栈中左括号之前的对象弹出
    {
     if(myArray.length==0){
      return false;
     }
     temp=myArray.pop();//非空,弹出对象
     while(temp!='('){//只要不是左括号,则全部弹出
      b+=temp;//并输出到后缀表达式中
      if(myArray.length==0){//保证栈为空
       break;
      }
      temp=myArray.pop();
     }
     break;
    }
    case '*':
    case '/':
    {
     if(myArray.length==0){//如果栈为空则直接入栈
      myArray.push(a[i]);
     }else{
      temp=myArray[myArray.length-1];
      if(temp=='+'||temp=='-'){//如果遇到高的,则遇到的继续入栈
       myArray.push(a[i]);//遇到的入栈
      }
     }
     break;
    }
    case '+':
    case '-':
    {
     if(myArray.length==0){//如果栈为空则直接入栈
      myArray.push(a[i]);
     }else{
      temp=myArray[myArray.length-1];
      if(temp=='/'||temp=='*'){//如果遇到低的,则栈中的出栈,遇到的入栈
       while(myArray.length!=0){
        temp=myArray.pop();//栈中的出栈
        b+=temp;//保存到存储空间
       }
       myArray.push(a[i]);//遇到的入栈
      }
     }
     break;
    }
    default:
    {
     b+=a[i];
     break;
    }
   }
  }
  //最后将栈中剩下的操作符输出
  while(myArray.length!=0){
   temp=myArray.pop();
   b+=temp;
  }
  return true;
 }
 var x="a*b+c*d-e/f";
 midTOLast(x);
 alert(b);//ab*cd*+ef/-
</script>
 </body>
</html>

当然,以上程序还存在一点bug,但是思想应该就是这样子的。

下面,我们将讲解如何通过后缀表达式计算出表达式的结果。

那么,我们将中缀表达式转化为后缀表达式后,如何继续计算呢?还是以这个例子为例。

     中缀表达式:a*b+c*d-e/f
     后缀表达式:ab*cd*+ef/-

基本思路如下:

遍历后缀表达式,遇到非操作符的字符则直接进栈,遇到操作符则出栈两个元素,进行对应操作,然后将得到的结果再次入栈。依次直到遍历完成,此处栈中保存的值就是当前表达式的值。

实现的JavaScript代码如下:

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
<script type="text/javascript">
 function getValue(a){
  var a_len=a.length,
   myArray=new Array();
   for(var i=0;i<a_len;i++){
    switch (a[i])
    {//遇到数值则直接入栈
     case '0':
     case '1':
     case '2':
     case '3':
     case '4':
     case '5':
     case '6':
     case '7':
     case '8':
     case '9':
     {
      myArray.push(a[i]);
      break;
     }
     case '+':
     {//遇到操作符则出栈两个元素进行对应操作
      temp=myArray.pop()+myArray.pop();
      myArray.push(temp);//再将结果入栈
      temp=null;
      break;
     }
     case '-':
     {
      s=myArray.pop();
      temp=myArray.pop()-s;
      myArray.push(temp);
      s=null;temp=null;
      break;
     }
     case '*':
     {
      temp=myArray.pop()*myArray.pop();
      myArray.push(temp);//再将结果入栈
      temp=null;
      break;
     }
     case '/':
     {
      s=myArray.pop();
      temp=myArray.pop()/s;
      myArray.push(temp);
      s=null;temp=null;
      break;
     }
    }
   }
   return myArray.pop();//算出结果
 }
 var a="12*34*+36/-";//1*2+3*4-3/6
 var b=getValue(a);//13.5
 alert(b);
</script>
 </body>
</html>

好啦,栈的应用场景还有很多,比如进制的转换,行编辑程序,迷宫求解等。这里就不一一介绍了。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。


# JavaScript  # 数据结构  #   # 应用  # 表达式求值  # C语言中栈和队列实现表达式求值的实例  # 浅谈C/C++ 语言中的表达式求值  # C++利用链栈实现表达式求值  # C++表达式求值详解  # 弹出  # 遍历  # 则将  # 为空  # 直接入  # 来实现  # 再将  # 都是  # 相关内容  # 很难  # 求值  # 两种  # 这个问题  # 感兴趣  # 可以通过  # 给大家  # 为例  # 在对  # 就将 


相关文章: 建站主机选购指南与交易推荐:核心配置解析  网站制作价目表怎么做,珍爱网婚介费用多少?  建站之星如何修改网站生成路径?  全景视频制作网站有哪些,全景图怎么做成网页?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  常州自助建站工具推荐:低成本搭建与模板选择技巧  如何在阿里云香港服务器快速搭建网站?  如何通过免费商城建站系统源码自定义网站主题与功能?  Swift中switch语句区间和元组模式匹配  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  建站之星安装后如何自定义网站颜色与字体?  济南专业网站制作公司,济南信息工程学校怎么样?  建站之星如何实现五合一智能建站与营销推广?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  建站之星收费标准详解:套餐费用及年费价格表一览  如何在阿里云购买域名并搭建网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  c++ stringstream用法详解_c++字符串与数字转换利器  如何零基础开发自助建站系统?完整教程解析  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  模具网站制作流程,如何找模具客户?  如何在建站之星绑定自定义域名?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  电商平台网站制作流程,电商网站如何制作?  如何基于云服务器快速搭建个人网站?  TestNG的testng.xml配置文件怎么写  如何快速生成凡客建站的专业级图册?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  如何在阿里云高效完成企业建站全流程?  制作门户网站的参考文献在哪,小说网站怎么建立?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  图册素材网站设计制作软件,图册的导出方式有几种?  如何彻底删除建站之星生成的Banner?  家庭建站与云服务器建站,如何选择更优?  长沙做网站要多少钱,长沙国安网络怎么样?  如何自定义建站之星模板颜色并下载新样式?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何通过服务器快速搭建网站?完整步骤解析  北京企业网站设计制作公司,北京铁路集团官方网站?  大同网页,大同瑞慈医院官网?  建站之星代理费用多少?最新价格详情介绍  建站之星logo尺寸如何设置最合适?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何选择服务器才能高效搭建专属网站?  如何通过虚拟主机快速搭建个人网站?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  威客平台建站流程解析:高效搭建教程与设计优化方案  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  高端云建站费用究竟需要多少预算?  如何在搬瓦工VPS快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。