C語言 逆波蘭演算法實現計算器(原始碼)

2021-10-23 18:30:08 字數 3141 閱讀 2090

三、逆波蘭演算法的c語言實現

概念:1.字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前。如 - × + 3 4 5 6

2.中綴表示式就是常見的運算表示式,如 (3+4)×5-6

3.字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後。如 3 4 + 5 × 6 -

逆波蘭式的特點在於運算物件順序不變,運算符號位置反映運算順序。採用逆波蘭式可以很好的表示簡單算術表示式,其優點在於易於計算機處理表示式。

1、構造乙個運算子棧和逆波蘭表示式佇列

2、讀入運算表示式,從左至右依次掃瞄字元,如果是數字則寫入佇列,如果是運算子則需要與棧頂運算子進行比較

3、運算子比較規則:

(1)如果運算子棧內為空或者檢測到棧頂運算子為 『(』 ,則掃瞄的運算子無條件入棧

(2)如果掃瞄的運算子優先順序比棧頂運算子優先順序高,則掃瞄運算子入棧;反之輸出棧頂運算子至表示式佇列,再次執行對比操作,直至掃瞄運算子優先順序比棧頂運算子優先順序高或者滿足第一條規則

(3)如果掃瞄到運算子為 『)』 ,拋棄 『)』 並從棧頂依次輸入運算子至佇列,直到遇見 『(』 ,拋棄 『(』 。

4、最後將棧內剩餘運算子輸入到佇列。

5、逆波蘭表示式轉換完成。

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+3--

-> a=1,

3+

例圖

1、構造乙個運算元棧

2、從逆波蘭表示式佇列中依次讀入字元,如果是運算元,則輸入到運算元棧。如果是運算子,則對棧頂運算元和次棧頂運算元進行相應的運算並且清除,最後將運算結果入棧。

3、佇列掃瞄並計算結束後,運算元棧內最終資料即運算結果。

#include

#include

#include

#include

union counter//定義new_res共同體儲存波蘭表示式

new_res[

100]=;

char res[

1000]=

;//輸入的中綴表示式

int flag[

100]=;

//與new_res一一對應的判斷陣列元素型別的flag陣列

int n =0;

//flag下標

int i =1;

//迴圈判斷標誌

intelement()

;//將中綴表示式轉換為字尾表示式儲存與new_res中

intcount

(union counter new_res[

100]

,int flag[

100]);

//將波蘭表示式計算並輸出結果

intmain()

return0;

}int

element()

;//運算子棧

char temp[

100]=;

int j =0;

int m =0;

//運算子棧下標

n =0;

//迴圈後重置flag下標

printf

("計算:");

scanf

("%s"

, res)

;for

(int i =

0; i <

strlen

(res)+1

; i++

)//strlen(res)+1確保最後一位資料被寫入

elseif(

!isdigit

(res[i])&&

(strcmp

(temp,"")

!=0))

//將temp中儲存的資料轉換為float型別寫給new_res

switch

(res[i]

)//判斷運算子的優先順序決定出棧入棧

else

break

;case

'*':

case

'/':

if(m ==

0|| stack_op[m-1]

!='*'

|| stack_op[m-1]

!='/'

)else

break

;case

')':

m--;while

(stack_op[m]

!='('

) stack_op[m]==0

;break

;default

:break;}

}for

(int k = m-

1; k >=

0; k--

)//將棧中剩餘的運算子全部寫入new_res

return0;

}int

count

(union counter new_res[

100]

,int flag[

100]);

//資料棧

for(

int i =

0; i < n; i++

)else

break

;default

:break;}

default

:break;}

}printf

("結果:%f\n"

, stack_num[0]

);return0;

}

執行結果:

計算:3*8

+2/4

-(6+

2/1)

結果:16.500000

您還要繼續嘛?繼續請輸入1,退出請輸入0:1

計算:9*9

-(11-

2)+(

4/2+

6)結果:80.000000

您還要繼續嘛?繼續請輸入1,退出請輸入0:1

計算:3*3

/6結果:1.500000

C語言棧實現逆波蘭計算器

逆波蘭計算器 輸入所要計算的表示式的逆波蘭式,並進行計算。如 1 2 4 5 其逆波蘭式 1 2 4 5 基礎的東西,還是要多敲 如下 中,輸入的格式如 1 2 4 5 include include include define stack init size 20 define stack in...

逆波蘭計算器

include include include define stack init size 20 初始化棧的空間 define stackincrement 10 擴充套件空間 define maxbuffer 10 最大緩衝區 typedef double elemtype 建立乙個棧 type...

逆波蘭計算器

1.逆波蘭表示式用途 逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如 a b c d 轉換為ab cd 2.逆波蘭表示式邏輯實現 如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後...