PHP スタックベースの高度な電卓機能の実装の詳細な説明
この記事では主に、PHP スタックに基づいて実装された高度な計算機関数を紹介します。これには、PHP スタックの定義と、スタックを使用して数値演算を実行するための関連操作テクニックが含まれます。みんなを助けて。
文字列演算式を取得した場合、その演算結果をどのように取得するのでしょうか?
現時点では、スタック アルゴリズムを使用して、この問題を非常に賢く解決できます。
アイデアは次のとおりです: (PHP 関数 substr ループを使用してこの文字列操作式をインターセプトし、この文字列の値を順番に取り出します [最初の文字からインターセプトする必要があります]。インターセプトの開始位置を次のように設定します。ループ 成長する変数は [$index=0] に初期化されます) 同時に、数値を格納するスタック [$numStack] と演算子を格納するスタック [$operStack] も 1 つ作成する必要があります。演算記号かどうかを判定できる関数で、切り取った各値をこのカスタム関数に入れて、数値か演算子か区別できる識別子を返すことで、値が数値か演算子かを判定します。演算子である場合は、数値スタックに挿入されます。演算子の場合は、シンボル スタックが挿入されます。数値スタックを挿入する場合は、直接挿入できますが、シンボル スタックには特別な処理が必要です [[シンボル スタックが空の場合は、空ではなく直接挿入します。挿入されたシンボルの操作の優先順位をシンボルと比較する必要があります。スタック内 (シンボルの優先順位を決定する関数を定義できます。* と / は 1 であると仮定し、+ と - は 0 であると仮定します。演算子の優先順位を取得できるように、数値が大きいほど優先順位が高いと仮定します)。挿入されるシンボルの優先順位は以下です。スタックの先頭にある演算子の優先順位は数値スタックから 2 つの値をポップし、それらを操作するためにシンボル スタックから演算子をポップします。
以下は PHP の例です [ハン シュンピン先生の PHP アルゴリズム チュートリアルを参照してください]
<html> <head> <meta http-equiv='content-type' content='text/html;charset=utf-8'/> </head> <h1>高级计算器</h1> <?php /** * 一个栈类 */ class MyStack{ public $top=-1;//默认是-1,表示该栈是空的 public $maxSize=15;//$maxSize表示栈最大容量 public $stack=array();// //入栈的操作 public function push($val) { //先判断栈是否已经满了 if($this->top==$this->maxSize-1){ echo '<br/>栈满,不能添加'; return; } $this->top++; $this->stack[$this->top]=$val; } //出栈的操作,就是把栈顶的值取出 public function pop() { //判断是否栈空 if($this->top==-1){ echo '<br/>栈空1'; return; } //把栈顶的值,取出 $topVal=$this->stack[$this->top]; $this->top--; return $topVal; } //显示栈的所有数据的方法. public function showStack() { if($this->top==-1){ echo '<br/>栈空2'; return; } echo '<br/>当前栈的情况是....'; for($i=$this->top;$i>-1;$i--){ echo '<br/> stack['.$i.']='.$this->stack[$i]; } } //判断是否是一个运算符 public function isOper($val) { if ($val=='+'||$val=='-'||$val=='*'||$val=='/') { return true; } } //判断栈是否为空 public function isEmpty() { if ($this->top==-1) return true; } /** * 比较运算符的优先级 * 我把 * 和/运算符的优先级看作1 * +和- 看作0 * 通过它们之间的比较就能得出它们的优先级谁更高 */ public function PRI($oper) { if ($oper=='*'||$oper=='/') { return 1; } else if ($oper=='+'||$oper=='-') { return 0; } } //返回栈顶端的值 public function getTop() { return $this->stack[$this->top]; } //计算 public function getResult($num1,$num2,$oper) { switch ($oper) { case '+': $res = $num2+$num1; break; case '-': $res = $num2-$num1; break; case '*': $res = $num2*$num1; break; case '/': $res = $num2/$num1; break; } return $res; } } //需要进行运算的表达式 $str = '12+5*2+3-5*2'; //字符串的指针 $index = 0; //声明一个用于组合联系数字的变量 $keepNum = ''; //定义一个数栈和一个符号栈 $numsStack=new MyStack(); $operStack=new MyStack(); while (true) { $val = mb_substr($str,$index,1); //如果是一个符号就入符号栈 否则入数栈 if ($operStack->isOper($val)==true) { //符号入栈前需要判断一下 栈为空直接入栈 不为空需要比较当前运算符与栈顶端的运算符 //如果当前运算符的优先级低于栈内的 则需要运算 if ($operStack->isEmpty()) { $operStack->push($val); } else { while (!$operStack->isEmpty()&&$operStack->PRI($val)<=$operStack->PRI($operStack->getTop())) { //当前符号的优先级要直到高于栈内的时候才能入栈 否则要计算 //当前运算符的优先级低于栈内的 则运算 $num1 = $numsStack->pop(); $num2 = $numsStack->pop(); $oper = $operStack->pop(); $res = $numsStack->getResult($num1,$num2,$oper); //计算完毕将结果入栈 $numsStack->push($res); } //把当前这个符号再入符号栈 $operStack->push($val); } } else { //考虑如果是连续数字的问题 $keepNum.=$val; //先判断是否已经到字符串最后.如果已经到最后,就直接入栈. if ($index==mb_strlen($str)-1) { $numsStack->push($keepNum);//是数字直接入栈 } else { //要判断一下$ch字符的下一个字符是数字还是符号. if ($operStack->isOper(mb_substr($str,$index+1,1))) { $numsStack->push($keepNum); $keepNum=''; } } } $index++;//让$index指向下一个字符. if ($index==mb_strlen($str)) break;//已扫描到字符串的末尾 就退出while循环 } /* 4. 当扫描完毕后,就依次弹出数栈和符号栈的数据,并计算,最终留在数栈的值,就是运算结果,只有符号栈不空就一直计算 */ while (!$operStack->isEmpty()) { $num1 = $numsStack->pop(); $num2 = $numsStack->pop(); $oper = $operStack->pop(); $res = $numsStack->getResult($num1,$num2,$oper); //计算完毕将结果入栈 $numsStack->push($res); } //当退出while后,在数栈一定有一个数,这个数就是最后结果 echo $str.'='.$numsStack->getTop(); ?>
再帰アルゴリズムに基づく Web 電卓の JS 実装の詳細な説明
PHPスタック、スタックプッシュおよびポップメソッドの定義、および完全な電卓の実装例
以上がPHP スタックベースの高度な電卓機能の実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
