逆波蘭計算器 中綴表示式轉字尾表示式

2021-08-14 06:24:27 字數 2389 閱讀 9914

1+(2+3)*4+5/2

這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有;

–1,2,3依次進棧,此時棧內依次為1 2 3

–遇到+ 2 3出棧計算得到5, 5再進棧,此時棧內依次為1 5

–4進棧,此時棧內依次為1 5 4

–遇到 * ,4 5 出棧計算得到20, 20再進棧, 此時棧內依次為1 20

–遇到+, 1 20出棧計算得到21, 21再進棧, 此時棧內依次為21

–5 2 進棧, 此時棧內依次為21 5 2

–遇到 /, 5 2出棧計算得到2.5, 2.5再進棧, 此時棧內依次為21 2.5

–遇到 +, 21 2.5出棧計算得到23.5, 23.5再進棧, 此時棧內依次為23.5

–最後23.5出棧,即為表示式1+(2+3)*4+5/2的最終結果

再次對比中綴與字尾兩種的寫法

1 + (2 + 3) * 4 + 5 / 2

1 2 3 + 4 * + 5 2 / +

對照以下規則反覆推敲演變過程:

1,逐個讀取輸入的中綴表示式中的字元

2,如果是數字,直接列印

3,如果是+或-,那麼我們可以斷定棧頂符號的優先順序不可能比它們更低.此時若棧不為空,則將棧頂符號依次出棧並列印,如果出棧過程中遇到左括號』(『,就老老實實的再將它老人家放回去,因為 『(』 只有在遇到 『)』 時才會出棧.也就是說守在外面的+或-只有在遇到』(『或者棧空了才能進去,這應該是整個邏輯中最複雜的一環

4,如果是』)』,那麼棧頂元素依次出棧並列印,直到』(『出棧,配對成功為止.

5,如果是』(『或者』*』或者』/』,不用想直接進棧

6,處理完成時一定要確保棧內所有元素均已出棧並列印

#define _crt_secure_no_warnings

#include

#include

#include

#define ok 1

#define error 0

#define maxsize 100

typedef char selemtype;

typedef int status;

typedef struct

sqstack;

//棧的初始化

status initstack(sqstack **s);

//入棧

status push(sqstack *s, selemtype e);

//出棧

status pop(sqstack *s, selemtype *e);

//判斷是否為空棧

int stackempty(sqstack *s);

#include    "sqstack.h"

//棧的初始化

status initstack(sqstack **s)

//入棧

status push(sqstack *s, selemtype e)

s->top++;

s->data[s->top] = e;

return ok;

}//出棧

status pop(sqstack *s, selemtype *e)

*e = s->data[s->top];

s->top--;

return ok;

}//判斷是否為空棧

逆波蘭計算 中綴轉字尾 字尾表示式計算

我們利用棧將中綴表示式轉換為字尾表示式 逆波蘭表示式 來計算表示式 此程式支援整數運算 遍歷中綴表示式,遇到運算元就輸出,遇到符號就壓入棧中 棧中的運算子為掛起狀態 但是操作符的壓棧出棧有如下規則 碰到運算元壓入棧中,碰到運算子提取棧頂兩個元素進行相應的操作,將運算元壓入棧中,直到整個表示式遍歷完成...

逆波蘭計算器與中綴表示式向字尾表示式的轉化例項

在本篇博文中,博主通過運用棧這一資料結構首先實現中綴表示式到字尾表示式的轉換,而後通過結果運用逆波蘭計算器得出計算結果。具體 如下 include include include using namespace std typedef char elemtype typedef enum statu...

中綴表示式轉字尾(逆波蘭)表示式

原則 從左到右遍歷中綴表示式 1 如果是數字則直接輸出 2 如果是左括號,直接入棧 3 如果是右括號,直接棧頂元素出棧並輸出,直到遇到左括號,左括號只出棧,不輸出 4 如果是符號,如果優先順序不高於棧頂符號則棧頂元素依次出棧並輸出 如果遇到 符號,如果棧非空並且棧頂元素不是左括號,則出棧並且輸出,否...