php實現一個簡單的四則運算計算器

  php實現一個簡單的四則運算計算器(還不支持括號的優先級)。利用棧這種數據結構來計算表達式很贊。

  這里可以使用棧的結構,由于php的數組“天然”就有棧的特性,這里直接就利用了數組。當然可以使用棧結構寫,道理一樣的。

  前輩(波蘭一位科學家)在計算帶有括號的四則表達式,利用逆波蘭算法(后綴表達法)。簡直神了!!其實代碼code并不難,難的是算法的指導,要先理解算法,才能編碼。

?

<?php$num_arr = array();// 聲明數字棧
$op_arr = array();// 聲明符號棧$str = "10+6*2-18/2-2";preg_match_all('/./', $str, $arr);// 把運算串分解成每個字符到$arr數組
$str_arr = $arr[0];$length = count($str_arr);
$pre_num = '';
// 開始入棧
for($i=0; $i<$length; $i++){$val = $str_arr[$i];// 數字if (is_numeric($val)){$pre_num .= $val;// 兼顧下一個字符可能也是數字的情況(多位數)if($i+1>=$length || isOper($str_arr[$i+1])){// 下一個是運算符或者到頭了,則把數字塞進數字棧array_push($num_arr, $pre_num);$pre_num = '';}// 符號判斷優先級,選擇是否入棧} else if (isOper($val)){if (count($op_arr)>0){// 判斷優先級,只要不大于符號棧頂的優先級,就開始計算,直到優先級大于了棧頂的,計算后才再把這個運算符入棧while (end($op_arr) && priority($val) <= priority(end($op_arr))){calc($num_arr, $op_arr);}}array_push($op_arr, $val);}
}//echo '<pre>';
//print_r($num_arr);
//print_r($op_arr);// 計算棧里剩余的
while(count($num_arr)>0){calc($num_arr, $op_arr);if (count($num_arr)==1){$result = array_pop($num_arr);break;}
}echo $str,' = ', $result;// 計算,獲取數字棧的兩個數,符號棧頂的運算符
function calc(&$num_arr, &$op_arr){if (count($num_arr)>0){$num1 = array_pop($num_arr);$num2 = array_pop($num_arr);$op = array_pop($op_arr);if ($op=='*') $re = $num1*$num2;if ($op=='/') $re = $num2/$num1;// 這里注意順序,棧是先進后出,所以$num2是被除數if ($op=='+') $re = $num2+$num1;if ($op=='-') $re = $num2-$num1;array_push($num_arr, $re);}
}// 獲取優先級
function priority($str){if ($str == '*' || $str == '/'){return 1;} else {return 0;}
}// 判斷是否是運算符
function isOper($oper){$oper_array = array('+','-','*','/');if (in_array($oper, $oper_array)){return true;}return false;
}

?

轉載于:https://www.cnblogs.com/firstForEver/p/5289200.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tcp與Ip協議的客戶端和服務器編程

Tcp與Ip協議的客戶端和服務器編程 本文就TCP和Ip協議的客戶端和服務器分別進行編程&#xff0c;實現了客戶端和服務端進行通信的功能&#xff0c;服務端對多個客戶端進行監聽&#xff0c;并能與多個客戶端通信。 服務器端代碼如下&#xff1a; using System; using System.Coll…

maven建立webapp項目時顯示Cannot change version of project facet Dynamic web module to 2.5

為什么80%的碼農都做不了架構師&#xff1f;>>> 網上查了很多東西都沒啥用&#xff0c;其實直接把這段代碼加到web.xml頭部&#xff0c;自然就不報錯了 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.…

python數據結構算法 北京大學_北京大學公開課《數據結構與算法Python版》

之前我分享過一個數據結構與算法的課程&#xff0c;很多小伙伴私信我問有沒有Python版。看了一些公開課后&#xff0c;今天特向大家推薦北京大學的這門課程&#xff1a;《數據結構與算法Python版》。課程概述很多同學想要轉行機器學習&#xff0c;也確實掌握了一些機器學習模型…

20道C#練習題(一)1——10題

1.輸入三個整數&#xff0c;xyz&#xff0c;最終以從小到大的方式輸出。利用if嵌套。 Console.Write("請輸入x"); double x double.Parse(Console.ReadLine()); Console.Write("請輸入y"); double y double.Parse(Console.ReadLine()); Console.Write(&q…

fd 句柄_linux文件描述符fd(windows下的句柄)

在Linux系統中一切皆可以看成是文件&#xff0c;文件又可分為&#xff1a;普通文件、目錄文件、鏈接文件和設備文件fd&#xff1a;file descriptor文件描述符0,1,2分別給了標準輸入、標準輸出和錯誤輸出。ls -l /proc/pid/fd可以查看某個進程所使用的fd用lsof可以查看比如&…

Python——三級菜單

#三級菜單函數 menu {北京&#xff1a;&#xff5b;海淀&#xff1a;&#xff5b;五道口&#xff1a;&#xff5b;&#xff5d;中關村&#xff1a;&#xff5b;&#xff5d;上帝&#xff1a;&#xff5b;&#xff5d;&#xff5d;昌平&#xff1a;&#xff5b;&#xff5d;朝陽…

HTTPS 原理解析

http://www.cnblogs.com/zery/p/5164795.html 一 前言 在說HTTPS之前先說說什么是HTTP&#xff0c;HTTP就是我們平時瀏覽網頁時候使用的一種協議。HTTP協議傳輸的數據都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用HTTP協議傳輸隱私信息非常不安全。為了保證這些隱…

python 函數參數注解_python-如何使用函數注釋來驗證函數調用類...

我最近才發現有一種叫做函數注釋的東西,但是我不太確定如何使用它.這是我到目前為止的內容&#xff1a;def check_type(f):def decorated(*args, **kwargs):counter0for arg, type in zip(args, f.__annotations__.items()):if not isinstance(arg, type[1]):msg Not the vali…

SQL Server Replication 中關于視圖的點滴

在服務器A數據庫TEST新建了一個本地發布&#xff08;Local Publications&#xff09;RPL_GES_MIS_TEST,在服務器B數據庫RPL_TEST上創建了一個本地訂閱&#xff08;Local Subscriptions&#xff09;&#xff0c;它訂閱了了這個發布RPL_GES_MIS_TEST.如下截圖所示&#xff0c;本地…

kbmmw 5.0 中的REST 服務

目前關于REST 服務的話題越來越熱&#xff0c;kbmmw 在5.0 里面開始支持rest。今天我就試一下kbmmw 的 rest 服務。閑話少說&#xff0c;開始。 老規矩&#xff0c;放上兩個kbmMWServer1和 kbmMWHTTPSysServerTransport1兩個控件。 設置kbmMWHTTPSysServerTransport1的server 屬…

php7 匿名繼承類_PHP7匿名類的用法示例

本文實例講述了PHP7匿名類的用法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;/*** Created by PhpStorm.* User: Itboot* Date: 2019/1/17* Time: 18:15*/class An{private $num;protected $age 15;public function __construct() {$this->num 1;}protected f…

python中不需要函數重載的原因

函數重載主要是為了解決兩個問題&#xff1a; 1.可變參數類型 2.可變參數個數 并且函數重載一個基本的設計原則是&#xff0c;僅僅當兩個函數除了參數類型和參數個數不同以外&#xff0c;其功能是完全相同的&#xff0c;此時才使用函數重載&#xff0c;如果兩個函數的功能其實不…

多租戶saas 架構_[譯/注] Force.com 多租戶互聯網應用開發平臺的設計

原文地址 http://cloud.pubs.dbs.uni-leipzig.de/sites/cloud.pubs.dbs.uni-leipzig.de/files/p889-weissman-1.pdf譯注&#xff1a;原文發表于 ACM&#xff0c;2009年6月作者Craig D Weissman, CTO, Salesforce.comSteve Bobrowski, Technical Marketing Consultant, Salesfor…

富文本

View Code轉載于:https://www.cnblogs.com/baidaye/p/5295448.html

Jenkins持續集成——用戶管理

一、基于安全矩陣系統管理 —>Configure Global Security相關權限的作用&#xff1a;其中有一些比較特別的權限&#xff1a;最大的權限是Overall的Administer&#xff0c;擁有該權限可以做任何事情。最基本的權限是Overall的Read&#xff0c;用戶必須賦予閱讀的權限&#xf…

pythonui教學視頻_分享軟件開發相關視頻教程(Java、C++、Python、UI設計、HTML5、iOS)...

以下是我收藏的關于開發及其他教程&#xff0c;基本都是花錢在網上買的&#xff0c;網盤沒有加密的&#xff0c;雖然特別愛學習&#xff0c;但并不可能有這么多的精力學習這么多&#xff0c;技術總是很快就被新的淘汰掉&#xff0c;放在網盤中確實太浪費呀&#xff0c;分享出去…

JAVA Set接口和其常用子類HashSet集合

Set接口&#xff0c;它里面的集合&#xff0c;所存儲的元素就是不重復的。 HashSet集合&#xff0c;采用哈希表結構存儲數據&#xff0c;保證元素唯一性的方式依賴于&#xff1a;hashCode()與equals()方法。 保證HashSet集合元素的唯一&#xff0c;其實就是根據對象的hashCode和…

python初始化函數_當你學會了Python爬蟲,網上的圖片素材就免費了

前言本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。加入作者的python學習圈子&#xff1a;1156465813 即可免費獲取&#xff0c;資料全在群文件里。資料可以領取包括不限于Python實戰演練、PDF電子文檔…

第三周作業(一)單元測試

下載vs2015安裝包&#xff0c;打開進行安裝. 選擇顏色 安裝完成&#xff0c;需要登錄 啟動vs 單元測試 1.打開vs界面。 2.新建項目。選擇Visual C# 創建類庫。 3.點擊確定后&#xff0c;進入代碼編輯界面。 4.根據書中代碼&#xff0c;寫入程序&#xff0c;并進行測試。 轉載于…

React-Native-lesson

React-Native-lesson 一、React-Native入門指南 lesson2: 認識代碼結構lesson4: 學會React-Native布局&#xff08;一&#xff09;lesson6: UI組件lesson8: 自己動手寫組件 https://github.com/vczero/toilet React Native完全開發的獨立App&#xff0c;支持ES6語法&#xff0c…