C++でStackを使用して逆ポーランド記法で入力された式の結果を求めるというAIZU ONLINE JUDGEのALDS_1_3_Aを解きました。
逆ポーランド記法とは、演算子をオペランドの後に記述するプログラムを記述する記法です。
例えば、(1 + 2) * (5 + 4)という中間記法で書かれた数式があったとする。
これを逆ポーランド記法では次のように書くことができます。
1 2 + 5 4 + *
逆ポーランド記法で与えられた数式の計算結果を出力してください。
1つの数式が1行に与えられます。連続するシンボル(オペランドあるいは演算子)は1つの空白で区切られて与えられます。
https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/3/ALDS1_3_Aより
逆ポーランド記法とは
逆ポーランド記法とは、演算子をオペランドの後に記述するプログラムを記述する記法です。
例えば、(1 + 2) * (5 + 4)という中間記法で書かれた数式があったとする。
これを逆ポーランド記法では次のように書くことができます。
1 2 + 5 4 + *
問題
逆ポーランド記法で与えられた数式の計算結果を出力してください。
入力例
1つの数式が1行に与えられます。連続するシンボル(オペランドあるいは演算子)は1つの空白で区切られて与えられます。
1 2 +
出力例
計算結果を1行に出力してください。
3
https://onlinejudge.u-aizu.ac.jp/courses/lesson/1/ALDS1/3/ALDS1_3_Aより
Stackの実装
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct Stack{
int S[1000];
int Top;
};
void push(Stack* stack, int num){
stack->S[stack->Top] = num;
stack->Top++;
}
int pop(Stack *stack){
stack->Top--;
return stack->S[stack->Top];
}
int main(void){
Stack stStack = {0};
char s[100];
int num1, num2;
while(scanf("%s", s) != EOF){
if (s[0] == '+'){
num1 = pop(&stStack);
num2 = pop(&stStack);
push(&stStack, num2+num1);
}
else if(s[0] == '-'){
num1 = pop(&stStack);
num2 = pop(&stStack);
push(&stStack, num2-num1);
}
else if(s[0] == '*'){
num1 = pop(&stStack);
num2 = pop(&stStack);
push(&stStack, num2*num1);
}
else{
push(&stStack, atoi(s));
}
}
num1 = pop(&stStack);
cout << num1 << endl;
return 0;
}