字尾表示式 棧

2021-08-18 02:38:58 字數 1663 閱讀 6323

若干行,每行對應乙個中綴表示式

若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式

x+a*(y-b)-z/f

a+b*c+(d*m-n)+(s-t)*y

a-b*c+(d-e*f)/g

xayb-*+zf/-

abc*+dm*n-+st-y*+

abc*-def*-g/+

解題思路:

首先如何實現中綴表示式轉換成字尾表示式,方法如下

1.首先劃分優先順序(運算子優先順序可參考課本53頁)

2. * 和 / 優先順序大於 + 和 -   "(" 和 ")"我們這裡做特殊處理  設定 #號的優先順序最低      

3.依次掃瞄中綴表示式 建立兩個棧,sa 和 sb。sb中存放運算子,初始化直接將乙個#號壓入sb棧底,方便後續操作

4.操作規則是:

(1)如果遇到運算元 壓入sa

(2)如果是運算子  則與sb棧頂運算子比較優先順序,若優先順序高於棧頂運算子,則入棧,若小於等於棧頂運算  符,則棧頂運算子出棧,並且壓入sa,然後繼續和棧頂運算子比較,直到高於棧頂運 算符優先順序,將其壓入sb.

5.特別的 如果遇到左括號  直接壓入sb.然後繼續按照上述規則操作,直到遇到右括號時,右括號不壓入,將sb中左括號後的運算子依次彈出並壓入sa.然後彈出左括號

6.中綴表示式掃瞄完後,將sb中剩餘的運算子依次彈出並壓入sa.

7. 退棧輸出sa.

以上過程請在草稿紙上自己用樣例資料實驗一遍,理解更加透徹。

ps:特別注意,因為需要比較各個運算子的優先順序  故自定義資料型別elemtype

typedef struct nodeelemtype;//資料結構
具體**及注釋如下:

#include#include#includetypedef struct nodeelemtype;//資料結構 

typedef structlinkstack;//棧

int initstack(linkstack *l)//初始化

int push(linkstack *l,elemtype elem)//壓棧

int compare(linkstack *s,elemtype elem)//比較運算子的優先順序

if( flag < elem.level) }

int pop(linkstack *l)//彈棧

}int main()

continue;

}while(compare(&s,b[i]))//比較優先順序 !

// 直到遇到比a[i]優先順序低的 跳出迴圈

push(&s,b[i]); // a[i]入棧

}else//運算元直接壓入運算元棧

}//字串掃瞄完 將剩餘的運算子依次入運算元棧

s.top-=1;

r.ch=s.top->ch;

while(s.top!=s.base)

//退棧輸出字尾表示式

pop(&l);

printf("\n"); }

}

棧 字尾表示式

看了老師給的部落格,學習了一下,我學的確實很菜啊,仿照寫了乙個可以實現任意數字個數的加括號運算,目前只支援加乙個括號。收穫真的挺大 def to rpn f4 defcompare x,y v return 1 if y else v x v y rpn,operators for i in f4 ...

字尾表示式與棧

stack,操作受限制的線性表,在表的一端進行插入和刪除,先進後出 filo 後進先出 lifo 表尾是棧頂 top 表頭是棧底 bottom top不是指標型別,但習慣稱為棧頂指標,習慣用詞還有push和pop表示入棧和出棧 棧空,top是 1 陣列 或者0,看是怎麼約定的,這裡採用棧空指向0 至...

棧 中綴 字尾表示式

利用棧計算字尾表示式 include include include using namespace std int main s.push num i cout i else if str i str i str i str i s.push res cout result 0 利用棧,把中綴表示...