#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX 20 /* スタックサイズ */
#define STACK_OK 0x8000 /* スタック成功を表すデータ */
#define STACK_FULL STACK_OK + 1 /* スタックサイズを超えたときのデータ */
#define STACK_END STACK_OK + 2 /* スタックの終わりを表すデータ */
/* 関数のプロトタイプ宣言 */
int push(int); /* スタックにデータを積む関数 */
int pop(void); /* スタックからデータを取り出す関数 */
/* グローバル変数 */
int stack[STACK_MAX]; /* スタック領域 [0] - [19] */
int stack_pointer = 0; /* スタックポインタ */
int main(void)
{
char data[20];
printf("逆ポーランド記法で書かれた数式を計算します。\n");
printf("input:");
scanf("%s",data);
printf("output:%d\n",res(data));
return 0;
}
int res(char data[]){
int i=0,x=0,y=0;
for(i=0;data[i] != '\0';i++){
switch(data[i]){
case '+':
x = pop();
y = pop();
push(x+y);
break;
case '-':
x = pop();
y = pop();
push(x-y);
break;
case '/':
x = pop();
y = pop();
push(y/x);
break;
case '*':
x = pop();
y = pop();
push(x*y);
break;
default :
push(data[i]);
break;
}
}
return pop();
}
int push(int d)
{
if(stack_pointer >= STACK_MAX) /* スタックポインタが最大 */
return(STACK_FULL); /* STACK_FULLを返す */
stack[stack_pointer] = d; /* スタックにデータ格納 */
++stack_pointer; /* スタックポインタに1加算 */
return(STACK_OK); /* STACK_OKを返す */
}
int pop(void)
{
if(stack_pointer == 0) /* スタックポインタが0 */
return(STACK_END); /* STACK_ENDを返す */
--stack_pointer; /* スタックポインタから1減算 */
return(stack[stack_pointer]); /* スタックのデータを返す */
}
逆ポーランド記法を用いた四則演算
逆ポーランド記法を用いた四則演算
C言語にて逆ポーランド記法で書かれた1桁の四則演算をスタックを使用し、計算するプログラムを作成したいのですが、23+と入力すると101と返ってきたりして、うまく動きません。どなたかよろしくお願いします。
Re: 逆ポーランド記法を用いた四則演算
%sは文字列です。数字の部分は文字列から数値型に治して計算してあげてください。
あと、23+ではなく2 3 +とスペースを入れないと2と3を入れたのか23を入れたのかわからなくなりますよね?
あと、23+ではなく2 3 +とスペースを入れないと2と3を入れたのか23を入れたのかわからなくなりますよね?
Re: 逆ポーランド記法を用いた四則演算
これ、どちらかは逆ではないでしょうか。
また、スタックから、後からpopした方(=先にpushした方)が第1オペランドである、
という原則に照らすと、厳密にいえば加算も乗算も書き方が逆であるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。