PHP使用逆波蘭式計算工資的方法,php波蘭計算工資_PHP教程

來源:互聯網
上載者:User

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程式設計有所協助。

http://www.bkjia.com/PHPjc/1039186.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1039186.htmlTechArticlePHP使用逆波蘭式計算工資的方法,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.