日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿龙学堂-中缀-后缀表达式的计算

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿龙学堂-中缀-后缀表达式的计算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、簡介

在數據結構中,有一種數據結構叫做:Stack,LIFO(Last In First Out),在這個結構中,有個后綴表達式計算,運用該數據結構進行計算。

棧是一種只允許一端操作的線性數據結構,具有LIFO(last in first out)的特點,具有廣泛的應用,如我在游戲編程模式--命令模式(2)中使用棧的結構來實驗撤銷、重做功能。現在打算用棧結構來實現后綴表達式的計算。

后綴表達式也叫逆波蘭表達式,其求值過程可以用到棧來輔助存儲。

2、后綴表達式

后綴表達式,指的是不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則)。

例如 5+(2+3)*4 轉換為后綴表達式為 523+4*+

3、后綴表達式的計算

規則:從左向右掃描,遇到數字壓棧,遇到操作符,彈出棧頂的兩個元素,先彈出的元素在右邊,后彈出來的在左邊,進行計算后,將結果壓棧,再往后掃描,直到掃描結束,輸出棧頂元素,即為最終結果。
523+4*+為例
5壓棧 2壓棧 3壓棧 遇到+號,彈出3 2,計算2+3,將5壓棧,此時棧為5 5,將4壓棧,遇到*號,彈出4 5,計算5*4,將20壓棧 此時棧為5 20 ,遇到+號,計算5+20,將25壓棧,掃描結束,輸出25。
以上就是計算過程。下面用C++編寫代碼,為了方便標記算式的結束,在末尾我們加上#,用來標識算式結束,這里我們只進行四則運算

#include <iostream> #include <stack> #include "string" using namespace std;int main() {stack<int> a;string temp;cin >> temp;int i = 0;while (true){if (temp[i]=='#') cout << a.top(); break;if (temp[i]<='9'&&temp[i]>='0') a.push(temp[i]-48);else{int x, y;y = a.top(); a.pop();x = a.top(); a.pop();switch (temp[i]){case '+':a.push(x + y); break;case '-':a.push(x - y); break;case '*':a.push(x * y); break;case '/':a.push(x / y); break;default:break;}}++i; }cin >> temp;return 0; }

4、中綴表達式轉后綴表達式

4.1、規則

中綴表達式a + b*c + (d * e + f) * g,其轉換成后綴表達式則為a b c * + d e * f? + g * +。

轉換過程需要用到棧,具體過程如下:

1)如果遇到操作數,我們就直接將其輸出。2)如果遇到操作符,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。3)如果遇到一個右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出并不輸出。4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,從棧中彈出元素直到遇到發現更低優先級的元素(或者棧為空)為止。彈出完這些元素后,才將遇到的操作符壓入到棧中。有一點需要注意,只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。5)如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。

4.2、實例

規則很多,還是用實例比較容易說清楚整個過程。以上面的轉換為例,輸入為a + b * c + (d * e + f)*g,處理過程如下:

1)首先讀到a,直接輸出。

2)讀到“+”,將其放入到棧中。

3)讀到b,直接輸出。

4)讀到“*”,因為棧頂元素"+"優先級比" * " 低,所以將" * "直接壓入棧中。

5)讀到c,直接輸出

6)讀到" + ",因為棧頂元素" * "的優先級比它高,所以彈出" * "并輸出, 同理,棧中下一個元素" + "優先級與讀到的操作符" + "一樣,所以也要彈出并輸出。然后再將讀到的" + "壓入棧中。

7)下一個讀到的為"(",它優先級最高,所以直接放入到棧中。

8)讀到d,將其直接輸出。

9)讀到" * ",由于只有遇到" ) "的時候左括號"("才會彈出,所以" * "直接壓入棧中。

10)讀到e,直接輸出。

11)讀到" + ",彈出" * "并輸出,然后將"+"壓入棧中。

12)讀到f,直接輸出。

13)接下來讀到“)”,則直接將棧中元素彈出并輸出直到遇到"("為止。這里右括號前只有一個操作符"+"被彈出并輸出。

14)讀到" * ",壓入棧中。讀到g,直接輸出。

15)此時輸入數據已經讀到末尾,棧中還有兩個操作符“*”和" + ",直接彈出并輸出。至此整個轉換過程完成。程序實現代碼后續再補充了。

4.3、轉換的另一種方法

1)先按照運算符的優先級對中綴表達式加括號,變成( ( a+(b*c) ) + ( ((d*e)+f) *g ) )2)將運算符移到括號的后面,變成((a(bc)*)+(((de)*f)+g)*)+3)去掉括號,得到abc*+de*f+g*+

?

?

具體細節關注微信公眾號? ?【阿龍學堂】

總結

以上是生活随笔為你收集整理的阿龙学堂-中缀-后缀表达式的计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。