最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數(shù)據(jù)結(jié)構(gòu)中棧的應(yīng)用之表達式求值問題詳解

 更新時間:2017年04月11日 15:09:23   作者:布瑞澤的童話  
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)中棧的應(yīng)用之表達式求值問題,詳細分析了中綴表達式、后綴表達式等概念、原理與轉(zhuǎn)換方法,以及基于后綴表達式實現(xiàn)的表達式求值相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了JavaScript數(shù)據(jù)結(jié)構(gòu)中棧的應(yīng)用之表達式求值問題。分享給大家供大家參考,具體如下:

下面來談一個比較經(jīng)典的表達式求值問題,這個問題主要是設(shè)計到操作符的優(yōu)先級。我們通??吹降谋磉_式都是中綴表達式,存在很多優(yōu)先級差別,而后綴表達式則沒有這些優(yōu)先級問題。下面先看看兩種表達式的區(qū)別。

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

從中綴表達式轉(zhuǎn)換到后綴表示式是很難實現(xiàn)的,我們這里可以通過棧的思想來實現(xiàn)。下面進行詳細的介紹是什么樣的思想:

在對一個中綴表示式進行轉(zhuǎn)換的時候,遇到非操作符的字符則直接保存到后綴表示式的存儲空間中。

遇到(,則壓入棧,只有遇到對應(yīng)的)才能被彈出。
遇到),就將(之前的操作符全部彈出,并保存到存儲空間。
遇到*和/這樣優(yōu)先級高的,就判斷棧中的操作符優(yōu)先級是否低于當前操作符。
如果棧中的遇到的低,則將遇到的繼續(xù)入棧;如果棧中的高,則將棧中的出棧,遇到的入棧。
最后,當字符串遍歷完成,依次彈出操作符,保存到存儲空間。

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

首先是ab被保存到了存儲空間,然后*入?!,F(xiàn)在棧中只有*。
遇到+之后,由于*比+優(yōu)先級高,所以*出棧,+入棧,這樣存儲空間變?yōu)閍b*,棧中變?yōu)?。
再時候遇到c,存儲空間變?yōu)閍b*c,棧中還是+。
接下來遇到*和d,由于+比*低,所以*繼續(xù)入棧,棧中表為了+*,存儲空間為ab*cd。
之后遇到-,由于*比-高,所以+*出棧,-入棧,存儲空間變?yōu)閍b*cd*+
……后面不用解釋了,悟性再低也應(yīng)該會了。

下面我們用JavaScript代碼來實現(xiàn)下吧。

<!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=='-'){//如果遇到高的,則遇到的繼續(xù)入棧
       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,但是思想應(yīng)該就是這樣子的。

下面,我們將講解如何通過后綴表達式計算出表達式的結(jié)果。

那么,我們將中綴表達式轉(zhuǎn)化為后綴表達式后,如何繼續(xù)計算呢?還是以這個例子為例。

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

基本思路如下:

遍歷后綴表達式,遇到非操作符的字符則直接進棧,遇到操作符則出棧兩個元素,進行對應(yīng)操作,然后將得到的結(jié)果再次入棧。依次直到遍歷完成,此處棧中保存的值就是當前表達式的值。

實現(xiàn)的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])
    {//遇到數(shù)值則直接入棧
     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 '+':
     {//遇到操作符則出棧兩個元素進行對應(yīng)操作
      temp=myArray.pop()+myArray.pop();
      myArray.push(temp);//再將結(jié)果入棧
      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);//再將結(jié)果入棧
      temp=null;
      break;
     }
     case '/':
     {
      s=myArray.pop();
      temp=myArray.pop()/s;
      myArray.push(temp);
      s=null;temp=null;
      break;
     }
    }
   }
   return myArray.pop();//算出結(jié)果
 }
 var a="12*34*+36/-";//1*2+3*4-3/6
 var b=getValue(a);//13.5
 alert(b);
</script>
 </body>
</html>

好啦,棧的應(yīng)用場景還有很多,比如進制的轉(zhuǎn)換,行編輯程序,迷宮求解等。這里就不一一介紹了。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學運算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • 用JavaScript實現(xiàn)PHP的urlencode與urldecode函數(shù)

    用JavaScript實現(xiàn)PHP的urlencode與urldecode函數(shù)

    這篇文章主要介紹了用JavaScript實現(xiàn)PHP的urlencode與urldecode函數(shù),很多情況下我們用了出來php urlencode出來的網(wǎng)址,需要的朋友可以參考下
    2015-08-08
  • 借助JavaScript腳本判斷瀏覽器Flash Player信息的方法

    借助JavaScript腳本判斷瀏覽器Flash Player信息的方法

    做了一個小的Demo,在測試時發(fā)現(xiàn)經(jīng)常報錯,對此總結(jié)了一下借助JavaScript腳本判斷瀏覽器Flash Player信息的方法,需要的朋友可以參考下
    2014-07-07
  • 微信小程序頁面間跳轉(zhuǎn)傳參方式總結(jié)

    微信小程序頁面間跳轉(zhuǎn)傳參方式總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于微信小程序頁面間跳轉(zhuǎn)傳參方式,文中通過示例代碼介紹的非常詳細,對大家學習或者使用小程序具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • 微信小程序?qū)崿F(xiàn)自定義加載圖標功能

    微信小程序?qū)崿F(xiàn)自定義加載圖標功能

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)自定義加載圖標功能,非常不錯具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • js讀寫json文件實例代碼

    js讀寫json文件實例代碼

    json文件想必大家對它并不陌生吧,它的靈活性還是不錯的,下面為大家介紹下js如何讀寫json文件
    2014-10-10
  • js捆綁TypeScript聲明文件的方法教程

    js捆綁TypeScript聲明文件的方法教程

    TypeScript 是 JavaScript 的超集,相比 JavaScript,其最關(guān)鍵的功能是靜態(tài)類型檢查 (Type Guard)。下面這篇文章主要給大家介紹了關(guān)于js捆綁TypeScript聲明文件的相關(guān)資料,需要的朋友可以參考下。
    2018-04-04
  • JavaScript使用Promise封裝Axios進行高效開發(fā)

    JavaScript使用Promise封裝Axios進行高效開發(fā)

    這篇文章主要介紹了JavaScript使用Promise封裝Axios進行高效開發(fā),Axios是一個基于Promise的HTTP庫,它可以幫助我們更方便地發(fā)起HTTP請求,并且提供了許多高級功能,感興趣的同學可以參考下文
    2023-05-05
  • JavaScript作用域與作用域鏈使用重點講解

    JavaScript作用域與作用域鏈使用重點講解

    當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈,作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問,下面這篇文章主要給大家介紹了關(guān)于JavaScript作用域與作用域鏈的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 原生JavaScript實現(xiàn)貪吃蛇游戲

    原生JavaScript實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了原生JavaScript實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • WebRTC媒體權(quán)限申請getUserMedia實例詳解

    WebRTC媒體權(quán)限申請getUserMedia實例詳解

    這篇文章主要為大家介紹了WebRTC媒體權(quán)限申請getUserMedia實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

西贡区| 永兴县| 桐城市| 克东县| 肇州县| 昆山市| 孝昌县| 彭泽县| 元谋县| 莱州市| 正定县| 沙洋县| 涞水县| 宜都市| 称多县| 西华县| 江油市| 吐鲁番市| 普定县| 涿鹿县| 溧阳市| 浏阳市| 香格里拉县| 横峰县| 平乐县| 许昌县| 武威市| 太原市| 喀喇沁旗| 改则县| 响水县| 广德县| 濮阳县| 建宁县| 甘南县| 手机| 怀来县| 报价| 化德县| 左贡县| 蓬莱市|