利用棧來實現計算表示式的自動計算(二)

2021-05-25 18:56:29 字數 2034 閱讀 9470

一、掃瞄一遍出結果的演算法設定:

(1):

設定兩個棧,乙個運算子棧,乙個運算元棧。初始化後將

"#"壓入操作符棧中。

(2):

順序掃瞄,當輸入為運算元時就將其壓入運算元棧。

(3):

當輸入為運算子時,則比較輸入運算子和運算子棧的棧頂運算子的優先順序的大小。若輸入運算子的優先順序高於運算子棧棧頂運算子的優先順序時,則將其輸入到運算子棧;若運算子棧棧頂運算子的優先順序高於輸入運算子的優先順序,則將棧中的運算子彈出並從運算元棧中彈出兩個運算元施以運算,將運算結果作為運算元輸出到運算元棧;然後重新比較輸入運算子和更新後的棧頂運算子的優先順序的大小。

(4):

當輸入運算子為

"("時,將

"("直接入運算子棧。

(5):

當輸入運算子為

")"時,將運算子棧棧頂運算子彈出並從運算元棧中彈出兩個運算元施以運算,將運算結果作為運算元輸出到運算元棧;重複此操作直至運算子棧的棧頂元素為

"(",並將

"("彈出並拋棄。

(6):

當掃瞄到

"#"時,說明算術表示式已經掃瞄完畢,運算子棧依次出棧並從運算元棧中彈出兩個運算元施以運算,將運算結果作為新的運算元輸出到運算元棧,直至運算子棧棧頂為

"#"時結束。

(7):

最後運算元棧的棧頂元素即為運算結果,將其輸出到螢幕。

對於優先順序的比較,如果是同種運算子,那麼在棧內的運算子的優先順序就比在棧外的運算子的優先順序大一;不同級的運算子它們的優先順序大小按原來的大小排列

二、掃瞄一遍出結果的源**:

#include

#define stacksize 100

/*定義字元棧

*/typedef char elemtype;

typedef struct

sqstack;

/*定義數值棧

*/typedef struct

dstack;

/*初始化數值棧

*/void  dsinit(dstack *s)

/*壓入數值棧

*/int dpush(dstack *s,double e)

else}/*

出數值棧

*/double dpop(dstack *s)

else}/*

初始化字元棧操作

*/void  initstack(sqstack *s)

/*壓入字元棧操作

*/int push(sqstack *s,elemtype e)

else}/*

出字元棧操作

*/elemtype pop(sqstack *s)

else}/*

取棧頂操作

*/int gettop(sqstack s,elemtype *e)

else

}/*

比較優先順序

*/int get_pri(int mode,char oper)

return tmp;

}char precede(char w,char ch)}/*

用於計算的函式

*/void  jisuan(char s,dstack *ds)}/*

掃瞄算術表示式的函式

*/double comp(char arr)

if(ch=='.')}}

dpush(&s2,x);

x=0;

d=1;

} /*

掃瞄到運算運算子的處理程式

*/if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='('||ch==')'||ch=='#')

if (precede(w,ch)=='<')

push(&s1,ch);

else

ch=(ch!='#') ? arr[++i] : ch;}}

gettop(s1,&w);

while(w!='#')

return dpop(&s2);}/*

主函式*/

void main()

利用棧來實現簡單的表示式計算

class staelseelse else while sta2.isempty system.out.println is over system.out.println sta1.pop sta1.pop int top int max int arr public sta int max p...

用棧來實現表示式的計算

棧可以用來實現表示式的計算 分別用兩個棧來儲存運算符合運算數,預設 變成表示式的結束操作,現在運算子棧中放入乙個 建,以便於後面的匹配,然後遍歷 字串,若是運算子,則與運算子的頭元素進行比較,優先順序高,則運算數拿出兩個,與運算子的頭元素進行運算,隨後入運算數的棧,在這裡沒搞明白為什麼這個 遍歷到的...

棧(一)利用棧計算表示式

整理了一下使用資料結構這本書上的內容 pragma once includeusing namespace std templateclass sq stack 建立容量為mm的空棧 templatesq stack sq stack int m 析構函式 templatesq stack sq s...