国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP使用逆波蘭式計算工資的方法

2024-05-04 23:38:20
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了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文件如下:

 

 
  1. <?php 
  2. /** 
  3. * math_rpn  
  4. * 
  5. * 實現逆波蘭式算法 
  6.  
  7. */ 
  8. class math_rpn { 
  9. //初始的計算表達式 
  10. private $_expression = ''
  11. //處理后的逆波蘭表達式 
  12. private $_rpnexp = array(); 
  13. //模擬棧結構的數組 
  14. private $_stack = array('#'); 
  15. //正則判斷 
  16. //private $_reg = '/^([A-Za-z0-9/(/)/+/-/*//])*$/'; 
  17. //優先級 
  18. private $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30); 
  19. //四則運算 
  20. private $_operator = array('(''+''-''*''/'')'); 
  21. public function __construct($expression) { 
  22. $this->_init($expression); 
  23. private function _init($expression) { 
  24. $this->_expression = $expression
  25. public function exp2rpn() { 
  26. $len = strlen($this->_expression); 
  27. for($i = 0; $i < $len$i++) { 
  28. $char = substr($this->_expression, $i, 1); 
  29. if ($char == '(') { 
  30. $this->_stack[] = $char
  31. continue
  32. else if ( ! in_array($char$this->_operator)) { 
  33. $this->_rpnexp[] = $char
  34. continue
  35. else if ($char == ')') { 
  36. for($j = count($this->_stack); $j >= 0; $j--) { 
  37. $tmp = array_pop($this->_stack); 
  38. if ($tmp == "(") { 
  39. break;  
  40. else { 
  41. $this->_rpnexp[] = $tmp
  42. continue
  43. else if ($this->_priority[$char] <= $this->_priority[end($this->_stack)]) { 
  44. $this->_rpnexp[] = array_pop($this->_stack); 
  45. $this->_stack[] = $char
  46. continue
  47. else { 
  48. $this->_stack[] = $char
  49. continue
  50. for($i = count($this->_stack); $i >= 0; $i--) { 
  51. if (end($this->_stack) == '#'break
  52. $this->_rpnexp[] = array_pop($this->_stack);  
  53. return $this->_rpnexp; 
  54. //測試實例 
  55. $expression = "(A*(B+C)-E+F)*G"
  56. var_dump($expression); 
  57. $mathrpn = new math_rpn($expression); 
  58. var_dump($mathrpn->exp2rpn()); 
  59. /*End of php*/ 

希望本文所述對大家的php程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂溪县| 南靖县| 涿州市| 安化县| 化德县| 镇安县| 石楼县| 大田县| 新化县| 顺义区| 高陵县| 宜丰县| 长沙县| 二连浩特市| 库尔勒市| 高淳县| 台南县| 南岸区| 北碚区| 湖南省| 西吉县| 黎平县| 恩平市| 丰宁| 保靖县| 民乐县| 宜城市| 峨山| 铜陵市| 定西市| 抚州市| 布拖县| 教育| 原平市| 伊金霍洛旗| 乐至县| 津市市| 临武县| 松桃| 章丘市| 鸡西市|