PHP逆波蘭式之工資計算執行個體

來源:互聯網
上載者:User
PHP如何使用逆波蘭式進行工資計算。本文主要介紹了PHP使用逆波蘭式計算工資的方法,執行個體分析了php逆波蘭式演算法的原理與相關提示。希望對大家有所協助。

本文執行個體講述了PHP使用逆波蘭式計算工資的方法。分享給大家供大家參考。具體如下:

將一個普通的中序運算式轉換為逆波蘭運算式的一般演算法是:

首先需要分配2個棧,一個作為臨時儲存運算子的棧S1(含一個結束符號),一個作為輸入逆波蘭 式的棧S2(空棧),S1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。可指定其他字元,不一定非#不可。從中綴式的左端 開始取字元,逐序進行如下步驟:

(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入S2棧;若取出的是運算子,並且當前S1棧頂為(,則當前運算子直接入S1棧。

(2)若取出的字元是運算子,則將該運算子與S1棧棧頂元素比較,如果該運算子優先順序大於S1棧棧頂運算子優先順序,則將該運算子進S1棧,否者,將S1棧的棧頂運算子彈出,送入S2棧中,直至S1棧棧頂運算子低於(不包括等於)該運算子優先順序,則將該運算子送入S1棧。

(3)若取出的字元是“(”,則直接送入S1棧棧頂。

(4)若取出的字元是“)”,則將距離S1棧棧頂最近的“(”之間的運算子,逐個出棧,依次送入S2棧,此時拋棄“(”。

(5)重複上面的1~4步,直至處理完所有的輸入字元

(6)若取出的字元是“#”,則將S1棧內所有運算子(不包括“#”),逐個出棧,依次送入S2棧。

完成以上步驟,S2棧便為逆波蘭式輸出結果。不過S2應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!

math_rpn.php檔案如下:


<?php/** * math_rpn  * * 實現逆波蘭式演算法 *   */class math_rpn {  //初始的計算運算式  private $_expression = '';  //處理後的逆波蘭運算式  private $_rpnexp = array();  //類比棧結構的數組  private $_stack = array('#');  //正則判斷  //private $_reg  = '/^([A-Za-z0-9\(\)\+\-\*\/])*$/';  //優先順序  private $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30);  //四則運算  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;  }}//測試執行個體$expression = "(A*(B+C)-E+F)*G";var_dump($expression);$mathrpn = new math_rpn($expression);var_dump($mathrpn->exp2rpn());/*End of php*/

相關推薦:

php 二叉樹遍曆演算法與例子

php 演算法之分割數組,不用array_chunk()_PHP教程

php 實現活動人選抽獎功能代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.