iOS仿寫計算器中綴轉字尾 表示式求值

2021-10-25 17:56:08 字數 2317 閱讀 1792

由於oc沒有自帶的棧檔案,只能鍊錶模擬棧

typedef

struct

stack;

//符號棧

//之前把double寫成了char改了兩天的bug後來還是岳靖翔哥哥改好的

//愛岳靖翔哥哥

typedef

struct

stacknum;

//數字棧

//出棧-(

void

) pop:

(stack *

)stack

//進符號棧-(

void

) pushfu:

(char

)s:(stack *

)stack

//進數字棧-(

void

) pushshu:

(double

)s:(stacknum *

)stack

//判斷棧空

-(bool)isempty:

(stack *

)stack

else

}//判斷運算子優先順序-(

int) whofirst:

(char

) c

else

if(c ==

'+'|| c ==

'-')

else

if(c ==

'*'|| c ==

'/')

return0;

}//數字運算 用於之後的字尾表示式求值-(

double

) jieshu:

(double

)a :

(double

)b :

(char

)c //括號是否匹配 用於後來按下計算器中等於鍵之後的防止括號不匹配問題

-(bool) pipei:

(char

*)s

stack *stack =

malloc

(sizeof

(stack));

stack->top =-1

;for

(int i =

0; i(s[i]

==')')}

if(stack->top ==-1

)else

return false;

}

-

(double

) end:

(char

*)s

else

if(s[i]

=='+'

|| s[i]

=='-'

|| s[i]

=='*'

|| s[i]

=='/'

)else

[self pushfu:s[i]

:fuhao];}

}else

if(s[i]

=='('

)else

if(s[i]

==')'

) fuhao->top--;;

}else

if(s[i]

=='=')}

}//驗證是否轉換成功

//比如0.2*5-1(中綴表示式

//轉換成0.2#5#*1-(字尾表示式

puts

(ans)

;//字尾表示式求值

int pos =0;

for(

int i =

0; i < k; i++

)else

}double h =

1, sum1 =

0, sum2 =0;

for(

int j = i + pos -

1; j >= i; j--

)else

if(ans[j]

=='.')}

sum2 +

= sum1;

[self pushshu:sum2 :shu]

; i +

= pos -1;

}else

if(ans[i]

=='+'

|| ans[i]

=='-'

|| ans[i]

=='*'

|| ans[i]

=='/')}

return shu->data[shu->top]

;}

完整**就是上面的加起來 組成mvc設計模式中的m

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

1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...

簡單計算器 中綴表示式轉字尾表示式 求值

命題人 外部匯入 時間限制 1.000 sec 記憶體限制 32 mb 解決 1817 提交 4382統計 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一...

中綴轉字尾表示式 字尾表達書計算

將中綴表示式轉換為字尾表示式 1 初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 2 從左至右掃瞄中綴表示式 3 遇到運算元時,將其壓入s2 4 遇到運算子時,比較其與s1棧頂運算子的優先順序 4 1 如果s1為空,或棧頂運算子為左括號 則直接將此運算子入棧 4 2 否則,若優先順序比棧頂運算子的...