php使用逆波蘭演算法實現四則運算器

2021-07-03 13:11:21 字數 1309 閱讀 4325

逆波蘭表示法,俗稱字尾表示法。

曾經被別人問過,四則運算器的實現,當時僅僅是算的兩個數的,週日研究了下四則運算表示式,看到逆波蘭演算法,從看演算法思路到實現並驗證花了近2個多小時,怕以後忘掉,所以記錄下來,放到工具包中。

逆波蘭演算法思路,重點是理解大括號的壓棧和出棧,這裡就不細說了。

有個部落格寫的不錯,入口:

下面是php**:

<?php

/** * created by phpstorm.

* user: lzf

* date: 15/6/28

* time: 21:40

*/error_reporting(0);

$expr = '1+(5-6*7)*9';

$expr = '2+45+6/2-45+(23-4)*5';

$expr = '2+45+6/2-20';

//運算子棧,在棧裡插入最小優先順序的運算子,避免進入不到去運算子比較的迴圈裡

$oparr = array('#');

//運算數棧;

$oprandarr = array();

//運算子優先順序

$oplevelarr = array(

')' => 2,

'(' => 3,

'+' => 4,

'-' => 4,

'*' => 5,

'/' => 5,

'#' => 1

);$bolanexprarr = array();

$exprlen = strlen($expr);

$inop = false;

$opnums = "";

//解析表示式

for($i = 0;$i <= $exprlen;$i++)

//與棧頂運算子比較,如果當前運算子優先順序小於棧頂運算子,則棧頂運算子彈出,一直到當前運算子優先順序不小於棧頂

while($op = array_pop($oparr))elseif($currentlevel >= $level && $currentlevel != 3)else}}

}else

}}array_push($bolanexprarr, $opnums);

//輸出剩餘運算子

while($leftop = array_pop($oparr))

}//計算逆波蘭表示式。

foreach($bolanexprarr as $v)else

}echo $result;

如有什麼錯誤,請大家批評指證。

逆波蘭表示式解決四則運算

逆波蘭表示式又叫做字尾表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式,解決了四則運算中括號改變運算子優先順序的問題。四則運算的表示式一般都是中綴表示式如 1 2 3 4 5,即操作符在兩個運算元之間。四則運算需要兩個步驟,一是把中綴表示式轉為字尾表示式,二是由字尾表達生成結果 c...

棧的應用 四則運算表示式(逆波蘭演算法)

基本思路 首先定義兩個棧,乙個存放數字,乙個存放符號。存放數字的棧 只有當後面的一位是符號時才入棧,這是因為如果是乙個多位數的情況。存放符號的棧 1.當符號棧為空或者是a i 不是 並且棧頂元素是 時或者符號優先順序大於棧頂元素的優先順序時入棧。2.當a i 是 並且棧頂元素是 時,彈出棧頂元素,即...

C 實現逆波蘭表示式求解四則混合運算的值

如下 using system using system.collections using system.collections.generic using system.linq using system.text using system.threading.tasks console.wri...