Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Reverse-Polnisch-Gehaltsberechnungsbeispiel

PHP-Reverse-Polnisch-Gehaltsberechnungsbeispiel

*文
*文Original
2017-12-27 13:41:541342Durchsuche

So verwenden Sie die umgekehrte polnische Notation für die Gehaltsberechnung in PHP. In diesem Artikel wird hauptsächlich die Methode von PHP vorgestellt, die den umgekehrten polnischen Algorithmus zur Lohnberechnung verwendet, und die Prinzipien und zugehörigen Verwendungstechniken des umgekehrten polnischen PHP-Algorithmus anhand von Beispielen analysiert. Ich hoffe, es hilft allen.

Das Beispiel in diesem Artikel beschreibt, wie PHP die umgekehrte polnische Notation zur Berechnung von Löhnen verwendet. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Der allgemeine Algorithmus zum Konvertieren eines gewöhnlichen Inorder-Ausdrucks in einen umgekehrten polnischen Ausdruck lautet:

Zunächst müssen Sie zwei Stapel zuweisen, einen als temporären Speicheroperatorstapel S1 (einschließlich eines Endsymbols), ein umgekehrter polnischer Stapel S2 (leerer Stapel) als Eingabe, der S1-Stapel kann zuerst in den Operator # mit der niedrigsten Priorität eingefügt werden. Beachten Sie, dass der Infix-Ausdruck mit dem Operator mit der niedrigsten Priorität enden sollte . . Es können auch andere Zeichen angegeben werden, nicht unbedingt #. Nehmen Sie Zeichen vom linken Ende des Infix-Ausdrucks und gehen Sie Schritt für Schritt wie folgt vor:

(1) Wenn das herausgenommene Zeichen ein Operand ist, wird der gesamte Operand analysiert und der Operand gesendet direkt in den S2-Stapel; wenn Was herausgenommen wird, ist ein Operator, und die aktuelle Spitze des S1-Stapels ist (, dann wird der aktuelle Operator direkt in den S1-Stapel gelegt.

(2) Wenn das Zeichen Wenn ein Operator herausgenommen wird, wird der Operator mit dem obersten Element des S1-Stapels kombiniert. Wenn die Priorität des Operators größer ist als die Priorität des Operators oben im S1-Stapel, wird der Operator hineingeschoben Andernfalls wird der oberste Operator auf dem S1-Stapel herausgenommen und an den S2-Stapel gesendet, bis der S1-Stapel eine niedrigere Priorität hat als der Operator (außer gleich). Der Operator wird an den S1-Stapel gesendet

(3) Wenn das herausgenommene Zeichen „(“ ist, wird es direkt an S1 gesendet. Die Oberseite des Stapels.

(4) Wenn das herausgenommene Zeichen „)“ ist, werden die Operatoren zwischen dem „(“, das am nächsten an der Spitze des S1-Stapels liegt, nacheinander vom Stapel genommen und der Reihe nach an den S2-Stapel gesendet. Zu diesem Zeitpunkt wird „(“ verworfen. ".

(5) Wiederholen Sie die obigen Schritte 1 bis 4, bis alle eingegebenen Zeichen verarbeitet wurden

(6) Wenn das herausgenommene Zeichen „#“ ist, fügen Sie alle Operatoren ein Nachdem Sie die oben genannten Schritte ausgeführt haben, wird der S2-Stack das Ergebnis nacheinander im umgekehrten polnischen Format ausgeben Machen Sie etwas. Dann können Sie es gemäß der umgekehrten polnischen Berechnungsmethode berechnen!

PHP-Algorithmus zum Teilen von Arrays ohne array_chunk() _PHP-Tutorial


<?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-Implementierung des Funktionscodes für die Event-Kandidatenlotterie

Das obige ist der detaillierte Inhalt vonPHP-Reverse-Polnisch-Gehaltsberechnungsbeispiel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn