2017-12-08 4 views
0

PHP로 간단한 계산기를하기 위해 RPN을 사용하려고합니다. 위키 설명과 몇 가지 자습서를 따르려고했지만 현재 첫 번째 피연산자와 관련된 문제를 해결하고 있습니다. end()로 지정할 수 없습니다.PHP의 RPN

내 문제는 $ 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"; 

답변

0

없음 다이빙을 너무 깊이 나는 몇 가지 실수를 지적 할 수있는 논리로 당신이 만든 :

  1. 귀하의 return end($stack);

    for 루프 안에 있습니다. 기본적으로 루프는 첫 번째 반복 만 실행 한 다음 함수를 종료합니다.
  2. 당신은 그렇지 않은 경우는 switch 블록에있는 모든 단일 기능을 실행하고 오류가 죽을 것이다, 모든 case 블록에 break;을 추가해야한다이 도움이 될

    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'); 
    } 
    

희망.

업데이트는 :

당신이 $argv[1]을 사용하고 있기 때문에 당신에게 그 php rpn.php "1 + 2" 같은 스크립트를 실행해야한다는 얘기를 깜빡 했네요. 가정하면 파일의 이름은 rpn.php입니다. 다음은 DEMO입니다. 내 제안이 있건 없건 달리 실행 해보십시오. 차이점을 알 수 있습니다. 그것은 알고리즘을 수정하지는 않지만 당신이 말한 오류를 수정합니다.

+0

나는 당신이 말한 것을 시도했지만 아무 것도 바뀌지 않았다. – AznYouth

+0

@AznYouth는 내 대답을 보았다. – zstate

+0

나의 이전 버전은 이미 그 점을 지적했다. @state – AznYouth