程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 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程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved