逆波蘭表示法,俗稱字尾表示法。
曾經被別人問過,四則運算器的實現,當時僅僅是算的兩個數的,週日研究了下四則運算表示式,看到逆波蘭演算法,從看演算法思路到實現並驗證花了近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...