PHP 中的错误 RPN
Error RPN in PHP
我正在尝试使用 RPN 在 PHP 中做一个简单的计算器。
我试图按照维基描述和几个教程来做到这一点,但我目前遇到第一个操作数的问题。我不能用 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";
不要太深入逻辑我可以指出你犯的几个错误:
- 您的
return end($stack);
在 for
循环内。基本上,你的循环只会 运行 第一次迭代然后退出函数。
你必须在每个 case
块中放置 break;
,否则它将执行 switch
块中的每个函数并死于错误:
switch($token[$i]) {
case '+':
add($stack, $nb1, $nb2);
break;
case '-':
sub($stack, $nb1, $nb2);
break;
case '/':
div($stack, $nb1, $nb2);
break;
case '*':
mul($stack, $nb1, $nb2);
break;
default:
die('Error');
}
希望这些对您有所帮助。
更新:
忘记提及您必须 运行 编写这样的脚本 php rpn.php "1 + 2"
因为您正在使用 $argv[1]
。假设 rpn.php
是您的文件名。这里是DEMO。尝试 运行 结合和不结合我的建议,您会发现不同之处。它不会修复您的算法,但会修复您所说的错误。
我正在尝试使用 RPN 在 PHP 中做一个简单的计算器。 我试图按照维基描述和几个教程来做到这一点,但我目前遇到第一个操作数的问题。我不能用 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";
不要太深入逻辑我可以指出你犯的几个错误:
- 您的
return end($stack);
在for
循环内。基本上,你的循环只会 运行 第一次迭代然后退出函数。 你必须在每个
case
块中放置break;
,否则它将执行switch
块中的每个函数并死于错误:switch($token[$i]) { case '+': add($stack, $nb1, $nb2); break; case '-': sub($stack, $nb1, $nb2); break; case '/': div($stack, $nb1, $nb2); break; case '*': mul($stack, $nb1, $nb2); break; default: die('Error'); }
希望这些对您有所帮助。
更新:
忘记提及您必须 运行 编写这样的脚本 php rpn.php "1 + 2"
因为您正在使用 $argv[1]
。假设 rpn.php
是您的文件名。这里是DEMO。尝试 运行 结合和不结合我的建议,您会发现不同之处。它不会修复您的算法,但会修复您所说的错误。