PHP基於堆疊實現的高階計算器功能示例

2022-09-28 09:21:07 字數 2124 閱讀 7816

當我們得到乙個字串表示式該如何去得出它的運算結果呢?

這時候我們就能使用堆疊的演算法很巧妙的解決這個問題。

思路是這樣的:(我們利用php函式substr迴圈去擷取這個字串表示式,依次取出這個字串的值【我們得從第乙個字元開始擷取】,我們將開始擷取位置設為乙個迴圈增長的變數,初始化為【$index=0】),同時還需要建立兩個棧,乙個專門存放數字【$numstack】,乙個存放運算子【$operstack】,我們還需要乙個可以判斷是否是運算符號的函式,將每次擷取的值放入這個自定義函式中,返回乙個可以區別為數字或運算子的標識,通過對這個標識的判斷確定值是數字還是運算子,是數字就插入數棧,是運算子的話就插入符號棧。插入數棧的話可直接插入,但是符號棧的話需要特殊處理一下[【如果符號棧為空則直接插入,不為空:我們要將插入的符號與棧內的符號進行運算優先順序比較(可以定義乙個函式來判定符號優先順序,把 *  和 / 假定為1  把 + 和 - 假定為0  假設數字大的優先順序高,如此就能得出運算子優先順序),當待插入的符號優先順序小於等於棧內頂端的運算子優先順序,就從數棧彈出兩個值  符號棧彈出乙個運算子 將它們進行運算】

下面是乙個php的例項【參考自韓順平老師的php演算法教程】

<?php /**

* 乙個棧類

*/class mystack

$this->top++;

$this->stack[$this->top]=$val;

}//出棧的操作,就是把棧頂的值取出

public function pop()

//把棧頂的值,取出

$topval=$this->stack[$this->top];

$this->top--;

return $topval;

}//顯示棧的所有資料的方法.

public function showstack()

echo '

當前棧的情況是....';

for($i=$this->top;$i>-1;$i--)

}//判斷是否是乙個運算子

public function isoper($val)

}//判斷棧是否為空

public function isempty()

/*** 比較運算子的優先順序

* 我把 * 和/運算子的優先順序看作1

* +和- 看作0

* 通過它們之間的比較就能得出它們的優先順序誰更高

*/public function pri($oper)

else if ($oper=='+'||$oper=='-')

}//返回棧頂端的值

public function gettop()

//計算

public function getresult($num1,$num2,$oper)

return $res;}}

//需要進行運算的表示式

$str = '12+5*2+3-5*2';

//字串的指標

$index = 0;

//宣告乙個用於組合聯絡數字的變數

$keepnum = '';

//定義乙個數棧和乙個符號棧

$numsstack=new mystack();

$operstack=new mystack();

while (true)

else

//把當前這個符號再入符號棧

$operstack->push($val);

}} else else }}

$index++;//讓$index指向下乙個字元.

if ($index==mb_strlen($str)) break;//已掃瞄到字串的末尾 就退出while迴圈}/*

4. 當掃瞄完畢後,就依次彈出數棧和符號棧的資料,並計算,最終留在數棧的值,就是運算結果,只有符號棧不空就一直計算

*/while (!$operstack->isempty())

//當退出while後,在數棧一定有乙個數,這個數就是最後結果

echo $str.'='.$numsstack->gettop();

?>

ps:這裡再為大家推薦幾款計算工具供大家進一步參考借鑑:

**一元函式(方程)求解計算工具:

科學計算器**使用_高階計算器**計算:

**計算器_標準計算器:

php 高階計算器

html 請輸入運算表示式 計算計算結果是 exp isset post exp post exp if empty exp return 3 2 6 7 60 5 10 70 5 5 3 5 1 2 4 6 數字棧 num arr 運算符號棧 oper arr exp 3 6 2 7 len st...

堆疊實現簡單計算器

讀入乙個只包含加減乘除的非負整數計算表示式,計算表示式的值,整數和運算子之間用乙個空格分隔。include include using namespace std char str 200 儲存表示式字串 int mat 5 stack int op 運算子棧 stack double in 數字棧...

堆疊入門 簡單計算器

題目鏈結 解題思路 利用堆疊對表示式求值的方法在任意一本資料結構教科書上都會做明確的闡述。這裡簡單的回顧 1.設立兩個堆疊,乙個用來儲存運算子,另乙個用來儲存數字。2.在表示式首尾新增標記運算子,該運算子運算優先順序最低。3.從左至右依次遍歷字串,若遍歷到運算子,則將其與運算子棧棧頂元素進行比較,若...