棧的應用 逆波蘭表示式

2021-08-05 22:07:56 字數 1259 閱讀 8823

逆波蘭表示式又稱為「字尾表示式」。例:4.99*1.06+5.99+6.99*1.06 的字尾表示式為 4.99 1.06 *5.99 +6.99 1.06 +正常寫的表示式又稱為中綴表示式,如何將乙個中綴表示式表示式轉換成字尾表示式?這裡就要用到棧。但見到乙個數時就把他推入棧中,在遇到乙個運算子時就將該運算子作用於該棧彈出的兩個數(符號)上,將說得結果推入棧中。

舉個例子:6 5 2 3 + 8 * +3 * 

①前四個字元放入棧中為:6 5 2 3;

②讀到乙個+號,2 3 出棧執行+法,結果5在壓入棧中,棧中元素為:6 5 5;

③8進棧,棧中元素為:6 5 5 8,讀入*,5 8出棧執行運算,結果返回棧,棧中元素:6 5 40

④以此類推,最後棧中元素為288,結果也就為288。

現在要求實現:計算帶有括號()的表示式的值,例如:32+76+(29+52*(76-24)-14)/12

思路:

1、使用兩個棧,乙個資料棧,乙個操作符棧。當讀到乙個運算元時,立即將他放入資料棧中,將操作符放入操作符棧中;

2、如果遇到乙個左括號,直接壓入操作符棧中;

3、如果遇到右括號彈出操作符棧中的操作符直到彈出左括號為止;

4、如果壓入的操作符的優先順序較高,那麼彈出棧中棧頂元素優先順序比他高的,知道遇到比他低的為止;

5、最後若字元棧為空,則結束。

**:

#include

#include

#include

//設定運算子的優先順序

int level(char op)

return x;

}//計算值

int cal(int x, int y, char op)

return result;

}//計算表示式

int compute(char s)

vas[++top]=y;

i--;}}

else

//否則直接進棧

ops[++top]=s[i];}}

else

//如果是右括號

otop--; //左括號出棧}}

i++;

}//字串遍歷完,棧中可能還有運算子

while(otop!=0)

return vas[vtop];

}//主函式

int main()

棧的應用 逆波蘭表示式

逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子 正常的表示式 逆波蘭表示式 a b a,b,a b c a,b,c,a b c d a,b,c,d,a d b c a,d,b,c,a 1...

波蘭表示式和逆波蘭表示式(棧)

中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...

棧的應用 逆波蘭表示式求值

逆波蘭表示式也叫字尾表示式,先運算元,後操作符。棧 後進先出 順序遍歷波蘭表示式,遇到運算元的時候入棧 遇到操作符,先讓運算元出棧運算運算元,然後再把運算結果入棧,所有的算式都可以用逆波蘭表示式寫出來。把算式12 3 4 6 8 2 2用逆波蘭表示式寫出來,就是 12 3 4 6 8 2 2 逆波蘭...