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é)束??芍付ㄆ渌址?,不一定非#不可。從中綴式的左端 開(kāi)始取字符,逐序進(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í)在開(kāi)發(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-05
php實(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)畫(huà)好,再生成出代碼,即可。2009-08-08
解析PHP的Yii框架中cookie和session功能的相關(guān)操作
這篇文章主要介紹了PHP的Yii框架中cookie和session功能的相關(guān)操作,需要的朋友可以參考下2016-03-03
php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法
這篇文章主要介紹了php判斷兩個(gè)浮點(diǎn)數(shù)是否相等的方法,涉及php操作浮點(diǎn)數(shù)的技巧,比較實(shí)用,需要的朋友可以參考下2015-03-03

