亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php簡單實現算術表達式轉換成逆波蘭式并求解

2020-03-22 17:50:37
字體:
來源:轉載
供稿:網友
  • 最近一直在學習C/C++,可學的都是原理語法之類的,沒有實戰成績甚是令人不爽。想用C/C++寫個計算器一直是我的夙愿,剛敲鍵盤,就不知可否了,想來想去還是對計算器的算法不是很清楚。由于本人是學php出身,所以先使用php將計算器算法給實現了一下,以便更好的學習C/C++。這個簡單的計算器采用的是逆波蘭式來做的,僅支持加減乘除四種運算,純粹個人練習記錄一下,還望多多支持。

    將算術表達式轉換成逆波蘭式
      建立運算符棧stackOperator用于運算符的存儲,壓入'@';建立逆波蘭式存儲棧stackOut,并置空。預處理表達式,正、負號前加0(如果一個加號(減號)出現在最前面或左括號后面,則該加號(減號)為正負號) 。順序掃描表達式,如果當前字符是數字(優先級為0的符號),則直接入棧stackOut;如果當前字符為運算符或括號(優先級不為0的符號),則判斷第4點 。若當前運算符為'(',直接入棧stackOperator;
      若為')',出棧(stackOperator)并順序輸出運算符直到遇到第一個'(',遇到的第一個'(' 出棧(stackOperator)但不輸出;
      若為四則運算符,比較棧頂元素與當前元素的優先級:
      如果棧頂元素運算符優先級 >= 當前元素的優先級, 出棧并順序輸出運算符直到棧頂元素優先級<當前元素優先級,然后將當前元素入棧(stackOperator);
      如果棧頂元素的優先級>當前元素的優先級,直接入棧(stackOperator)。重復第3點直到表達式掃描完畢。順序出棧(stackOperator)并將輸出的元素壓入棧stackOut,直到棧頂元素為'@'。
    計算逆波蘭式
      準備一個棧stack,并置空。順序讀取(從棧底到棧頂)棧stackOut,碰到操作數,入棧stack。 www.it165.net碰到操作符,stack彈出兩個元素,運算并將運算結果入棧stack。重復執行2~3步驟,棧stack即是表達式結果。
    實現代碼
    /** * php簡單實現算術表達式轉換成逆波蘭式,并求解。 * 僅支持加減乘除四種運算 * @author joe, joenali@163.com * @date 2013-01-17 * <pre> *  require 'Calc.php'; *  $calc = new Calc('(1+9)/2'); *  echo $calc->getExpression(); *  echo $calc->calculate(); * </pre> */html' target='_blank'>class Calc {    protected $_stackOperator = array('@');    protected $_stackOut = array();    protected $_operator = array('@', '(', ')', '+', '-', '*', '/');    protected $_priority = array('@' => 0, '(' => 10, ')' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30);    public function __construct($expression) {        $this->convert($expression);    }    /**     * 解析字符串表達式     * 解析字符串表達式,將數字和運算符分離,用數組存儲     * @param string $expression     * @return array     */    protected function expressionParase($expression) {        $arr = str_split($expression);        $data = $tmp = array();        do {            $item = array_shift($arr);            if (in_array($item, $this->_operator)) {                if ($tmp) {                    array_push($data, implode('', $tmp));                    $tmp = array();                }                array_push($data, $item);            } else {                array_push($tmp, $item);            }        } while(count($arr));        array_push($data, implode('', $tmp));        return $data;    }    /**     * 生成逆波蘭式     * @param string $expression     */    protected function convert($expression) {        foreach ($this->expressionParase($expression) as $char) {            if (preg_match("/^[0-9]+$/", $char)) {                array_push($this->_stackOut, $char);            } else if (in_array($char, $this->_operator)) {                if ('(' == $char) {                    array_push($this->_stackOperator, $char);                } else if (')' == $char) {                    while (count($this->_stackOperator) > 1) {                        $drop = array_pop($this->_stackOperator);                        if ('(' == $drop) {                            break;                        } else {                            array_push($this->_stackOut, $drop);                        }                    }                } else {                    while (count($this->_stackOperator)) {                        $oTop = end($this->_stackOperator);                        if ($this->_priority[$char] > $this->_priority[$oTop]) {                            array_push($this->_stackOperator, $char);                            break;                        } else {                           $drop = array_pop($this->_stackOperator);                            array_push($this->_stackOut, $drop);                        }                    }                }            }        }        while (count($this->_stackOperator)) {            $drop = array_pop($this->_stackOperator);            if ('@' == $drop) {                break;            } else {                array_push($this->_stackOut, $drop);            }        }    }    /**     * 獲取逆波蘭式     * @return string     */    public function getExpression() {        return implode('', $this->_stackOut);    }    /**     * 計算逆波蘭式     * @return int     */    public function calculate() {        $stack = array();        foreach ($this->_stackOut as $char) {            if (preg_match("/^[0-9]+$/", $char)) {                array_push($stack, $char);            } else if (in_array($char, $this->_operator)) {                $b = array_pop($stack);                $a = array_pop($stack);                array_push($stack, $this->operator($a, $b, $char));            }        }        return end($stack);    }    protected function operator($a, $b, $o) {        switch ($o) {            case '+':                return intval($a) + intval($b);                break;            case '+':                return intval($a) + intval($b);                break;            case '-':                return intval($a) - intval($b);                break;            case '*':                return intval($a) * intval($b);                break;            case '/':                return intval($a) / intval($b);                break;        }    }}

    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    精品视频在线播放色网色视频| 亚洲国产精品人久久电影| 精品久久久久久久久中文字幕| 91精品国产91久久久久久不卡| 成人在线视频网| 亚洲第一免费播放区| 日韩网站免费观看| 国产亚洲精品激情久久| 黑人巨大精品欧美一区二区| 亚洲国产精品va| 欧美极品第一页| 国产精欧美一区二区三区| 亚洲欧美日韩中文视频| 深夜福利国产精品| 国产精品久久久久久av福利| 中文字幕亚洲字幕| 成人性教育视频在线观看| 国产一区二区久久精品| 久久久www成人免费精品| 色系列之999| 欧美性xxxx18| 欧美精品videosex性欧美| 日本午夜精品理论片a级appf发布| 久久精品99无色码中文字幕| 国产精品伦子伦免费视频| 亚洲国产精品一区二区三区| 亚洲国产成人久久综合| 国产精品亚洲第一区| 伊人一区二区三区久久精品| 日韩精品免费在线观看| 欧美大人香蕉在线| 国产精品免费久久久| 日韩在线不卡视频| 久久九九热免费视频| 欧美成人黑人xx视频免费观看| 亚洲www在线| 国产精品入口免费视频一| 青草青草久热精品视频在线网站| 中文字幕9999| 国产成+人+综合+亚洲欧洲| 国产精品日韩欧美综合| 久久高清视频免费| 欧美日韩在线一区| 午夜精品久久久久久久白皮肤| 国产精品视频精品视频| 自拍视频国产精品| 欧美老女人在线视频| 欧美在线视频网| 欧美亚洲第一区| 国产专区精品视频| 国产激情综合五月久久| 国产精品久久不能| 亚洲精品国产精品自产a区红杏吧| 一本色道久久88综合日韩精品| 国产精品第3页| 精品视频在线播放色网色视频| 国产精品白嫩初高中害羞小美女| 国产最新精品视频| 青青精品视频播放| 日韩大陆欧美高清视频区| 久久久久久国产精品三级玉女聊斋| 欧洲中文字幕国产精品| 久久久亚洲网站| 久久综合免费视频影院| 国产一区红桃视频| 国产97免费视| 久久免费在线观看| 国产中文字幕亚洲| 亚洲男人的天堂网站| 亚洲激情视频在线| 国产精品视频久久久久| 狠狠爱在线视频一区| 亚洲欧美国产精品| 欧美高清电影在线看| 久久久久久久亚洲精品| 亚洲欧美中文在线视频| 最近2019年中文视频免费在线观看| 国产精品第2页| 国产综合福利在线| 日韩美女激情视频| 日本不卡免费高清视频| 欧美做受高潮1| 亚洲男人第一av网站| 久久人人爽亚洲精品天堂| 国产日韩精品在线播放| 91免费人成网站在线观看18| 欧洲成人午夜免费大片| 欧美成aaa人片免费看| 狠狠干狠狠久久| 国语自产精品视频在线看一大j8| 亚洲欧美一区二区三区情侣bbw| 日韩在线播放视频| 911国产网站尤物在线观看| 亚洲丁香久久久| 亚洲欧美中文日韩v在线观看| 亚洲欧洲xxxx| 91精品视频一区| 成人写真福利网| 国产日韩欧美在线看| 日韩福利视频在线观看| 日韩免费观看高清| 国产美女精品视频免费观看| 亚洲图片在线综合| 久久精品中文字幕一区| 亚洲国产美女久久久久| 欧美激情一区二区久久久| 欧美亚洲激情视频| 国产色婷婷国产综合在线理论片a| 国产91网红主播在线观看| 久久影院资源站| 性色av一区二区三区免费| 国产精品久久久久不卡| 成人黄色在线播放| 亚洲精品美女网站| 成人观看高清在线观看免费| 成人美女av在线直播| 另类美女黄大片| 性金发美女69hd大尺寸| 国产视频福利一区| 国语自产精品视频在免费| 欧美中文在线视频| 精品一区二区三区四区| 亚洲自拍高清视频网站| 国产精品pans私拍| 91国产高清在线| 日韩美女视频免费在线观看| 亚洲国产精品人人爽夜夜爽| 国语自产精品视频在线看一大j8| 久久精品99久久久久久久久| 精品久久久久久久久久久| 一区二区亚洲精品国产| 久久这里只有精品视频首页| 久久久国产精品视频| 久久久中文字幕| 茄子视频成人在线| 国产精品男人的天堂| 亚洲黄一区二区| 日韩精品在线视频美女| 欧美一级大胆视频| 日本国产一区二区三区| 亲子乱一区二区三区电影| 欧美激情精品久久久久久黑人| 黑人精品xxx一区一二区| 亚洲最新av在线| 国产精品久久77777| 国产成人精品一区二区在线| 欧美精品电影在线| 欧美午夜激情在线| 欧美激情性做爰免费视频| 91国产视频在线播放| 欧美午夜www高清视频| 国内精品久久久久久中文字幕| 色偷偷噜噜噜亚洲男人的天堂| 亚洲欧美日韩高清| 亚洲tv在线观看| 亚洲精品有码在线| 欧美日韩国产二区| 久久久久久九九九| 久久精品人人做人人爽| 国产精品亚洲精品| 亚洲福利在线观看| 精品国产区一区二区三区在线观看| 成人在线一区二区| 91wwwcom在线观看|