PHP スタック キュー

https://himaise.com/php/

中間記法、逆ポーランド記法

中間記法を逆ポーランド記法で入力して、それらを出力する。
中間記法は、(2+4)/(2-1)みたいな一般的な記述で、逆ポーランド記法は、24+21-/というような記述のこと。

PHP スタックとキュー

そもそもphpではスタック形式と通常の配列とで区別をしない。
array_push()(array_pop()で取り除く)でスタック形式で配列を作成できる。渡された変数は配列の最後に加えられる。なので、通常の$array[]=$a;のような形式と同じような意味を持つ。逆の意味を持つのは、array_unshift(array_shift)でこれらをキューと呼ぶ。

スタック、逆ポーランド記法の計算

入力を「1 2 + 3 4 -*」として「-3」を出力する。演算子は、+、-、*のみ。
(※途中で不明になった…。breakとか使わないと。)
⇒この辺り参照のこと(Cf,スタックとキューを極める! 〜 考え方と使い所を特集 〜

php

<?php
$input_line = trim(fgets(STDIN));
$string  = preg_replace("/( | )/", "", $input_line );
$array = str_split ($string);
$stack = [];
foreach ($array as $key => $value){
    array_push($stack,$value);
}
$add = [];//+
$subtract = [];//-
$multiply = [];//*
foreach ($stack as $ke => $val){
    if($val == "+"){
        $add[] = $ke;
    }
    if($val == "-"){
        $subtract[] = $ke;
    }
    if($val == "*"){
        $multiply[] = $ke;
    }
}
$result =0;
$res = 0;
$res2 = 0;
foreach ($stack as $k => $v){
    if($k < $add[0]){
        $result += $stack[$k];
    }
    if($k < $subtract[0]){
        if(is_numeric($v) && ($add[0] < $k)){
            $res = $v;
        }
    }
    if($k < $multiply[0]){
        if(is_numeric($v) && ($subtract[0] < $k)){
            $res2 = $v;
        }else{
            
        }
    }
}
var_dump($res);
var_dump($res2);
?>

C の場合

一応、Cの場合で参照。

int main(){
  int a,b;
  top = 0;
  char s[100];

  while( scanf("%s", s) != EOF) {
    if( s[0] == '+' ) {
      a = pop();
      b = pop();
      push(a + b);
    } else if(s[0] == '-'){
      b = pop();
      a = pop();
      push(a - b);
    } else if(s[0] == '*'){
       a = pop();
       b = pop();
       push(a * b);
    } else{
       push(atoi(s))
    }
  }
  printf("%d\n",pop());
  return 0;
}

参照

・『アルゴリズムとデータ構造』(渡部有隆、2020)
array_push
array_unshift

basic, php, programming

Posted by himajinn