計算器 逆波蘭表示式

2021-06-18 13:21:09 字數 2751 閱讀 2108

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 出棧計算得...