我试图使用RPN,以便在PHP中做一个简单的计算器。为了做到这一点,我尝试遵循wiki描述和几个教程,但目前我遇到了第一个操作数的一个问题。我不能用end()来分配它。
我的问题来自于行$nb1 = end($stack);
<?php
function add($stack, $nb1, $nb2)
{
array_push($stack, $nb1 + $nb2);
$result = $nb1 + $nb2;
echo $nb1 . ' + ' . $nb2 . ' = ' . $result . "\n";
}
function sub($stack, $nb1, $nb2)
{
array_push($stack, $nb1 - $nb2);
$result = $nb1 - $nb2;
echo $nb1 . ' - ' . $nb2 . ' = ' . $result . "\n";
}
function div($stack, $nb1, $nb2)
{
array_push($stack, $nb1 / $nb2);
$result = $nb1 / $nb2;
echo $nb1 . ' / ' . $nb2 . ' = ' . $result . "\n";
}
function mul($stack, $nb1, $nb2)
{
array_push($stack, $nb1 * $nb2);
$result = $nb1 * $nb2;
echo $nb1 . ' * ' . $nb2 . ' = ' . $result . "\n";
}
function calc($input)
{
$stack = array();
$token = explode(" ", trim($input));
$count = count($token);
// echo $count . "\n";
// print_r($token);
for ($i = 0; $i < $count; $i++) {
$tokenNUm = "";
if (is_numeric($token[$i])) {
array_push($stack, $token[$i]);
print_r($token);
} else {
$nb2 = end($stack);
array_pop($stack);
$nb1 = end($stack);
array_pop($stack);
echo "nb1 : ". $nb1 . "\n";
echo "nb2 : ". $nb2 . "\n";
switch($token[$i]) {
case '+':
add($stack, $nb1, $nb2);
case '-':
sub($stack, $nb1, $nb2);
case '/':
div($stack, $nb1, $nb2);
case '*':
mul($stack, $nb1, $nb2);
default:
die('Error');
}
}
return end($stack);
}
}
echo "Final result = " . calc($argv[1]) . "\n";发布于 2017-12-08 03:41:10
不要太深地钻研逻辑,我可以指出你犯的几个错误:
return end($stack);在for循环中。基本上,循环只运行第一次迭代,然后退出函数。break;块中放置case,否则它将执行switch块中的每个函数,并错误地死去:
开关($token$i){大小写'+':加法($stack,$nb1,$nb2);中断;大小写'-':sub($stack,$nb1,$nb2);break;case '/':div($stack,$nb1,$nb2);break;case '*':mul($stack,$nb1,$nb2);中断;默认值: die('Error');}希望这些能帮上忙。
更新
忘记提到您必须像这样运行php rpn.php "1 + 2"脚本,因为您使用的是$argv[1]。假设rpn.php是文件的名称。这是演示。尝试在没有我的建议的情况下运行它,您将看到不同之处。它没有修正你的算法,但它修正了你所说的错误。
https://stackoverflow.com/questions/47706027
复制相似问题