由於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 否則,若優先順序比棧頂運算子的...