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 8小時(shí)時(shí)間差的解決方法小結(jié)
前幾天發(fā)現(xiàn)一個(gè)問(wèn)題 date("Y-m-d G:i T",time()) 取出來(lái)的時(shí)間和本地時(shí)間老差8個(gè)小時(shí),可我的系統(tǒng)明明是中國(guó)標(biāo)準(zhǔn)時(shí)(GMT+8),最后終于找到了問(wèn)題所在。2009-12-12
php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法
這篇文章主要介紹了php使用Jpgraph繪制復(fù)雜X-Y坐標(biāo)圖的方法,通過(guò)設(shè)置圖像陰影、邊距、字體、顏色、曲線等實(shí)現(xiàn)Jpgraph繪制復(fù)雜坐標(biāo)圖的功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-06-06
PHP 循環(huán)刪除無(wú)限分類子節(jié)點(diǎn)的實(shí)現(xiàn)代碼
本篇文章是對(duì)PHP中循環(huán)刪除無(wú)限分類子節(jié)點(diǎn)的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php Redis函數(shù)用法實(shí)例總結(jié)【附php連接redis單例類】
這篇文章主要介紹了php Redis函數(shù)用法,結(jié)合實(shí)例形式總結(jié)分析了php redis操作常用函數(shù)及具體使用方法,并附帶php連接redis單例類,需要的朋友可以參考下2017-11-11
PHP關(guān)聯(lián)數(shù)組實(shí)現(xiàn)根據(jù)元素值刪除元素的方法
這篇文章主要介紹了PHP關(guān)聯(lián)數(shù)組實(shí)現(xiàn)根據(jù)元素值刪除元素的方法,實(shí)例分析了php差集運(yùn)算函數(shù)array_diff及數(shù)組遍歷對(duì)比刪除的兩種方法,需要的朋友可以參考下2015-06-06
php實(shí)現(xiàn)約瑟夫問(wèn)題的方法小結(jié)
這篇文章主要介紹了php實(shí)現(xiàn)約瑟夫問(wèn)題的方法,實(shí)例總結(jié)了兩種常見(jiàn)的實(shí)現(xiàn)約瑟夫問(wèn)題的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
PHP實(shí)現(xiàn)的操作數(shù)組類庫(kù)定義與用法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的操作數(shù)組類庫(kù)定義與用法,結(jié)合實(shí)例形式分析了php數(shù)組操作類完整定義與簡(jiǎn)單使用技巧,需要的朋友可以參考下2019-05-05
1億條數(shù)據(jù)如何分表100張到Mysql數(shù)據(jù)庫(kù)中(PHP)
這篇文章主要介紹了當(dāng)數(shù)據(jù)量猛增的時(shí)候如何把一億條數(shù)據(jù)分表100張到Mysql數(shù)據(jù)庫(kù)中,需要的朋友可以參考下2015-07-07

