寝癖頭の解法

小学生の目線から、勉強中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #ALDS1_3_A Stack

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題
 逆ポーランド記法は、演算子オペランドの後に記述する数式やプログラムを記述する記法です。
 例えば、一般的な中間記法で記述された数式 (1+2)*(5+4) は、逆ポーランド記法では 1 2 + 5 4 + * と記述されます。
 逆ポーランド記法では、中間記法で必要とした括弧が不要である、というメリットがあります。
 逆ポーランド記法で与えられた数式の計算結果を出力してください。

・入力される値
 1つの数式が1行に与えられます。
 連続するシンボル(オペランドあるいは演算子)は1つの空白で区切られて与えられます。

・期待する出力
 計算結果を1行に出力してください。

・条件
 2 ≤ 式に含まれるオペランドの数 ≤ 100
 1 ≤ 式に含まれる演算子の数 ≤ 99
f:id:neguse_atama:20200425104555p:plain

僕が作成、提出したコードは、以下のとおりです。

/*
 ALDS1_3_A Stack
 http://judge.u-aizu.ac.jp/
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
#include<stdlib.h>
int value[100];
int sp=0;
void Push(const int val){
    value[sp++]=val;
}
int Pop(void){
    return value[--sp];
}
void Operand(const char operand){
    int ch,val=operand-'0';
    while((ch=getchar())!=' '){
        val=val*10+(ch-'0');
    }
    Push(val);
}
void Operator(const char operate){
    int tmp1=Pop(),tmp2=Pop();
    switch(operate){
        case '+': Push(tmp2+tmp1); break;
        case '-': Push(tmp2-tmp1); break;
        case '*': Push(tmp2*tmp1); break;
        default : break;
    }
}
int main(void){
    while(1){
        int ch=getchar();
        if(ch==' ' || ch=='\n'){
            continue;
        }
        if(ch==EOF){
            break;
        }
        switch(ch){
            case '+': Operator(ch); break;
            case '-': Operator(ch); break;
            case '*': Operator(ch); break;
            default : Operand(ch);  break;
        }
    }
    printf("%d\n",Pop());
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ALDS1_3_A Stack