色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          棧的經(jīng)典運(yùn)用

          作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏

          /************************************************
          *當(dāng)所有對(duì)象遍歷完成以后,需要判斷棧中是否存在對(duì)象
          *棧中為空說(shuō)明是平衡的,非空則說(shuō)明是非空的對(duì)象
          ************************************************/
          if(stack.isempty())
          {
          cout << "string is blanced!!" << endl;
          return true;
          }
          else/*沒(méi)有正確的匹配,并輸出具體不匹配的符號(hào)*/
          {
          cout << stack.pop() << " " << "Unblance string!!" << endl;
          return false;
          }
          }

          本文引用地址:http://cafeforensic.com/article/201612/324510.htm

          采用上面的代碼能夠符號(hào)是否平衡的判斷。

          接下來(lái)說(shuō)明一下表達(dá)式的求值問(wèn)題,表達(dá)式的求值問(wèn)題主要設(shè)計(jì)到操作符的優(yōu)先級(jí)問(wèn)題,比如()、*/、+-這幾種符號(hào)的優(yōu)先級(jí)是不一樣的,其中括號(hào)的優(yōu)先級(jí)最好,乘除其次,加減最低,我們通??吹降谋磉_(dá)式都是中綴表達(dá)式,也就是在操作符的兩邊都有對(duì)象,當(dāng)然括號(hào)除外啦,這種中綴表達(dá)式是不便于在程序中處理的,因?yàn)榇嬖诤芏嗟膬?yōu)先級(jí)差別,很難把握從那個(gè)位置先計(jì)算。

          如果在表達(dá)式中沒(méi)有了優(yōu)先級(jí)的問(wèn)題,求值問(wèn)題也就變得相對(duì)來(lái)說(shuō)更加簡(jiǎn)單了,后綴表達(dá)式是一種非優(yōu)先級(jí)的表達(dá)式表示方式,但是如何實(shí)現(xiàn)中綴表達(dá)式到后綴表達(dá)式的切換也是很難實(shí)現(xiàn)的。

          中綴表達(dá)式到后綴表達(dá)式的實(shí)現(xiàn)如下:

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

          從上面的表達(dá)式可以知道后綴表達(dá)式相對(duì)來(lái)說(shuō)比較容易判斷計(jì)算的基本過(guò)程,而且不存在括號(hào)的煩惱。采用棧實(shí)現(xiàn)轉(zhuǎn)換的基本思路如下:
          對(duì)一個(gè)中綴表達(dá)式進(jìn)行遍歷,當(dāng)遇到非操作符的字符直接保存到后綴表達(dá)式的存儲(chǔ)空間中,如果遇到左括號(hào),則將左括號(hào)壓入棧中,因?yàn)閮?yōu)先級(jí)最高,只有遇到右括號(hào)才會(huì)被彈出。如果遇到右括號(hào),則將左括號(hào)之前的操作符全部彈出,并保存到后綴表達(dá)式的存儲(chǔ)空間中,當(dāng)然這種存儲(chǔ)的順序和出棧的順序是一致的,括號(hào)操作符在后綴表達(dá)式中是不存在的,因此不需要將括號(hào)保存到后綴表達(dá)式的存儲(chǔ)空間中。如果遇到乘除操作符(*/),則判斷棧中的操作符優(yōu)先級(jí)是否低于當(dāng)前的操作符也就是判斷是否是加減操作符,如果不是則將棧中的操作符(也就是*、/),并保存到后綴表達(dá)式存儲(chǔ)空間中,然后將當(dāng)前的操作符壓入棧中,如果是則直接將操作符入棧。如果操作符是加減操作符,則彈出棧中左括號(hào)之前的所有操作符,并保存到后綴表達(dá)式存儲(chǔ)空間中,然后將操作符本身壓入棧中。當(dāng)字符串遍歷完成以后,依次彈出操作符,并保存到后綴表達(dá)式存儲(chǔ)區(qū)中。

          通過(guò)上面處理的中綴表達(dá)式就能完成后綴的轉(zhuǎn)換,但是由于需要比較操作符的優(yōu)先級(jí)問(wèn)題,因此可能需要出棧以后,直接將對(duì)象又壓棧的問(wèn)題,這是實(shí)現(xiàn)這類轉(zhuǎn)換時(shí)需要注意的?;镜膶?shí)現(xiàn)如下:

          /*****************************************
          * 實(shí)現(xiàn)表達(dá)式中綴到表達(dá)式后綴的轉(zhuǎn)換
          *****************************************/
          bool midtolast(string &src, string &dst)
          {
          string::size_type len = src.size();

          /*用來(lái)保存棧中彈出的對(duì)象*/
          char temp =