1.實現原理:
說明:在我原來做的逆波蘭計算器中,postfix是用來表示逆波蘭表示式的。但是和buptpatriot討論後,想直接實現,下面是直接實現的方法:
首先,定義優先順序:
function level($op)
}
之後,掃瞄輸入序列,讀取輸入的字串,把其中的數字(可能是浮點型,負數)和操作符提取出來
收集浮點數:
function readin($expr)
if($expr[$i] == '-' && ($expr[$i-1] == null || $expr[$i-1] == '(')
&& (is_numeric($expr[$i+1]) || $expr[$i+1] == '('))
array_push($infix, $expr[$i]);
} else
} var_dump($infix);
return $infix;
}
對於否定符號(-)做處理:
if($expr[$i] == '-' && ($expr[$i-1] == null || $expr[$i-1] == '(')
&& (is_numeric($expr[$i+1]) || $expr[$i+1] == '('))
此時,否定符號'-'轉化成'^'
1) 如果是數字,則存入棧 postfix 中;
2) 如果是運算子:
2.1)是 『(』 ,則存入棧 stack 中;
2.2)是『+』,『-』,『*』,『/』,『』,則檢查棧stack是否為空:
2.2.1)stack 為空:則存入棧內
2.2.2 ) stack不為空,執行下面的操作:
從stack中彈出乙個元素op
如果這個元素的不是 『(』 且彈出元素的優先順序大於當前掃瞄元素的優先順序,就將彈出元素存入postfix棧內,同時從postfix中彈出2個元素a,b,計算a op b的結 果,將其存入postfix中;
否則,把彈出元素op重新壓入棧stack內
最後,當前掃瞄到的運算子入棧stack
2.3) 是『^』 :執行下面的操作:
從postfix中彈出1個元素a,將(0-a)存入postfix中;
2.4) 是『)』 :執行下面的操作:
彈出元素存入postfix棧內,同時從postfix中彈出2個元素a,b,計 算a op b的結果,將其存入postfix中;
直到彈出元素為'(';
畫乙個表來看:4/((3-1)*2) = 1的計算過程
currentstackpostfix
4empty4/
/4(/(
4(/((4
3/((43-
/((-431
/((-
431)
/(42
*/(*422
/(*422)/
44empty
1(result)
2.php **:
<?php
if(isset($_post['expr']))
function readin($expr)
if($expr[$i] == '-' && ($expr[$i-1] == null || $expr[$i-1] == '(') && (is_numeric($expr[$i+1]) || $expr[$i+1] == '('))
array_push($infix, $expr[$i]);
} else
} var_dump($infix);
return $infix;
}function cal($expr)
else
else
}} return array_pop($stack);
}function infix2postfix($expr)
else
if($expr[$i] == '+' || $expr[$i] == '-' || $expr[$i] == '*' || $expr[$i] == '/' || $expr[$i] == '^')
else
}array_push($stack, $expr[$i]);
}if($expr[$i] == ')')
}} }
while(($last_op = array_pop($stack)) != null)
return $postfix;
}function operate($left,$op,$right)
}function level($op)
}?>
3.執行結果:輸入:4/((3-1)*2)
輸出:
包含 否定符號的結果:
輸入:-(-1.2+1.8)/(1/3.0)
輸出:
計算器(表示式計算 字尾表示式實現)逆波蘭表示式
問題描述 從標準輸入中讀入乙個整數算術運算表示式,如24 1 2 36 6 2 2 12 2 2 計算表示式結果,並輸出。要求 1 表示式運算子只有 表示式末尾的 字元表示表示式輸入結束,表示式中可能會出現空格 2 表示式中會出現圓括號,括號可能巢狀,不會出現錯誤的表示式 3 出現除號 時,以整數相...
字尾表示式計算規則 逆波蘭計算器
從左到右掃瞄,將數字壓入堆疊 遇到運算子,依次彈出數字棧中的棧頂元素和次棧頂元素,計算出來的值,再次入棧 依次迴圈掃瞄字尾表示式重複1,2規則,棧中唯一的數字就是字尾表示式的計算結果 這裡主要注意下第二條,計算時 棧頂元素和次棧頂元素 在符號運算時的先後順序 將次棧頂元素放在 運算符號的 左邊 棧頂...
逆波蘭計算器 中綴表示式轉字尾表示式
1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...