首頁 >後端開發 >php教程 >php逆波蘭式演算法的原理及使用方法

php逆波蘭式演算法的原理及使用方法

墨辰丷
墨辰丷原創
2018-06-08 10:13:102527瀏覽

本篇主要介紹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 = &#39;&#39;;
  //处理后的逆波兰表达式
  private $_rpnexp = array();
  //模拟栈结构的数组
  private $_stack = array(&#39;#&#39;);
  //正则判断
  //private $_reg  = &#39;/^([A-Za-z0-9\(\)\+\-\*\/])*$/&#39;;
  //优先级
  private $_priority = array(&#39;#&#39; => 0, &#39;(&#39; => 10, &#39;+&#39; => 20, &#39;-&#39; => 20, &#39;*&#39; => 30, &#39;/&#39; => 30);
  //四则运算
  private $_operator = array(&#39;(&#39;, &#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;, &#39;)&#39;);
  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 == &#39;(&#39;) {
        $this->_stack[] = $char;
        continue;
      } else if ( ! in_array($char, $this->_operator)) {
        $this->_rpnexp[] = $char;
        continue;
      } else if ($char == &#39;)&#39;) {
        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) == &#39;#&#39;) 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腳本的測試方法及實例

PHP處理會話函數總結分享

以上是php逆波蘭式演算法的原理及使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn