PHP使用逆波蘭式計(jì)算工資的方法
本文實(shí)例講述了PHP使用逆波蘭式計(jì)算工資的方法。分享給大家供大家參考。具體如下:
將一個(gè)普通的中序表達(dá)式轉(zhuǎn)換為逆波蘭表達(dá)式的一般算法是:
首先需要分配2個(gè)棧,一個(gè)作為臨時(shí)存儲(chǔ)運(yùn)算符的棧S1(含一個(gè)結(jié)束符號(hào)),一個(gè)作為輸入逆波蘭 式的棧S2(空棧),S1??上确湃雰?yōu)先級(jí)最低的運(yùn)算符#,注意,中綴式應(yīng)以此最低優(yōu)先級(jí)的運(yùn)算符結(jié)束??芍付ㄆ渌址灰欢ǚ?不可。從中綴式的左端 開始取字符,逐序進(jìn)行如下步驟:
(1)若取出的字符是操作數(shù),則分析出完整的運(yùn)算數(shù),該操作數(shù)直接送入S2棧;若取出的是運(yùn)算符,并且當(dāng)前S1棧頂為(,則當(dāng)前運(yùn)算符直接入S1棧。
(2)若取出的字符是運(yùn)算符,則將該運(yùn)算符與S1棧棧頂元素比較,如果該運(yùn)算符優(yōu)先級(jí)大于S1棧棧頂運(yùn)算符優(yōu)先級(jí),則將該運(yùn)算符進(jìn)S1棧,否者,將S1棧的棧頂運(yùn)算符彈出,送入S2棧中,直至S1棧棧頂運(yùn)算符低于(不包括等于)該運(yùn)算符優(yōu)先級(jí),則將該運(yùn)算符送入S1棧。
(3)若取出的字符是“(”,則直接送入S1棧棧頂。
(4)若取出的字符是“)”,則將距離S1棧棧頂最近的“(”之間的運(yùn)算符,逐個(gè)出棧,依次送入S2棧,此時(shí)拋棄“(”。
(5)重復(fù)上面的1~4步,直至處理完所有的輸入字符
(6)若取出的字符是“#”,則將S1棧內(nèi)所有運(yùn)算符(不包括“#”),逐個(gè)出棧,依次送入S2棧。
完成以上步驟,S2棧便為逆波蘭式輸出結(jié)果。不過(guò)S2應(yīng)做一下逆序處理。便可以按照逆波蘭式的計(jì)算方法計(jì)算了!
math_rpn.php文件如下:
<?php /** * math_rpn * * 實(shí)現(xiàn)逆波蘭式算法 * */ class math_rpn { //初始的計(jì)算表達(dá)式 private $_expression = ''; //處理后的逆波蘭表達(dá)式 private $_rpnexp = array(); //模擬棧結(jié)構(gòu)的數(shù)組 private $_stack = array('#'); //正則判斷 //private $_reg = '/^([A-Za-z0-9\(\)\+\-\*\/])*$/'; //優(yōu)先級(jí) private $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30); //四則運(yùn)算 private $_operator = array('(', '+', '-', '*', '/', ')'); public function __construct($expression) { $this->_init($expression); } private function _init($expression) { $this->_expression = $expression; } public function exp2rpn() { $len = strlen($this->_expression); for($i = 0; $i < $len; $i++) { $char = substr($this->_expression, $i, 1); if ($char == '(') { $this->_stack[] = $char; continue; } else if ( ! in_array($char, $this->_operator)) { $this->_rpnexp[] = $char; continue; } else if ($char == ')') { for($j = count($this->_stack); $j >= 0; $j--) { $tmp = array_pop($this->_stack); if ($tmp == "(") { break; } else { $this->_rpnexp[] = $tmp; } } continue; } else if ($this->_priority[$char] <= $this->_priority[end($this->_stack)]) { $this->_rpnexp[] = array_pop($this->_stack); $this->_stack[] = $char; continue; } else { $this->_stack[] = $char; continue; } } for($i = count($this->_stack); $i >= 0; $i--) { if (end($this->_stack) == '#') break; $this->_rpnexp[] = array_pop($this->_stack); } return $this->_rpnexp; } } //測(cè)試實(shí)例 $expression = "(A*(B+C)-E+F)*G"; var_dump($expression); $mathrpn = new math_rpn($expression); var_dump($mathrpn->exp2rpn()); /*End of php*/
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP實(shí)現(xiàn)簡(jiǎn)單數(shù)字分頁(yè)效果
我們平時(shí)在開發(fā)中,經(jīng)常需要用到分頁(yè),在項(xiàng)目中要用到分頁(yè)。分頁(yè)功能是經(jīng)常使用的一個(gè)功能,下面我們就來(lái)簡(jiǎn)單分享個(gè)數(shù)字的分頁(yè)效果2015-07-07讓php處理圖片變得簡(jiǎn)單 基于gb庫(kù)的圖片處理類附實(shí)例代碼下載
讓php處理圖片變得簡(jiǎn)單 基于gb庫(kù)的圖片處理類附實(shí)例代碼下載,需要的朋友可以參考下。2011-05-05php實(shí)現(xiàn)圖片添加描邊字和馬賽克的方法
這篇文章主要介紹了php實(shí)現(xiàn)圖片添加描邊字和馬賽克的方法,通過(guò)自定義函數(shù)imagemask與imagetextouter實(shí)現(xiàn)圖片添加馬賽克與文字描邊的效果,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12數(shù)據(jù)庫(kù)查詢記錄php 多行多列顯示
數(shù)據(jù)庫(kù)查詢記錄多行多列顯示,其實(shí)是用php生成符合table標(biāo)準(zhǔn)格式的代碼,大家只要對(duì)table熟悉下,或?qū)崿F(xiàn)畫好,再生成出代碼,即可。2009-08-08解析PHP的Yii框架中cookie和session功能的相關(guān)操作
這篇文章主要介紹了PHP的Yii框架中cookie和session功能的相關(guān)操作,需要的朋友可以參考下2016-03-03php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法
這篇文章主要介紹了php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法,涉及php操作浮點(diǎn)數(shù)的技巧,比較實(shí)用,需要的朋友可以參考下2015-03-03