若干行,每行對應乙個中綴表示式
若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式
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)如果遇到運算元 壓入sa5.特別的 如果遇到左括號 直接壓入sb.然後繼續按照上述規則操作,直到遇到右括號時,右括號不壓入,將sb中左括號後的運算子依次彈出並壓入sa.然後彈出左括號(2)如果是運算子 則與sb棧頂運算子比較優先順序,若優先順序高於棧頂運算子,則入棧,若小於等於棧頂運算 符,則棧頂運算子出棧,並且壓入sa,然後繼續和棧頂運算子比較,直到高於棧頂運 算符優先順序,將其壓入sb.
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 利用棧,把中綴表示...