逆ポーランド記法を用いた四則演算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ピエトロ

逆ポーランド記法を用いた四則演算

#1

投稿記事 by ピエトロ » 7年前

C言語にて逆ポーランド記法で書かれた1桁の四則演算をスタックを使用し、計算するプログラムを作成したいのですが、23+と入力すると101と返ってきたりして、うまく動きません。どなたかよろしくお願いします。

コード:

#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]);   /* スタックのデータを返す */
}

ホヅミ
記事: 110
登録日時: 9年前

Re: 逆ポーランド記法を用いた四則演算

#2

投稿記事 by ホヅミ » 7年前

%sは文字列です。数字の部分は文字列から数値型に治して計算してあげてください。
あと、23+ではなく2 3 +とスペースを入れないと2と3を入れたのか23を入れたのかわからなくなりますよね?

box
記事: 1746
登録日時: 9年前

Re: 逆ポーランド記法を用いた四則演算

#3

投稿記事 by box » 7年前

ピエトロ さんが書きました:

コード:

				push(x-y);
				push(y/x);
これ、どちらかは逆ではないでしょうか。

また、スタックから、後からpopした方(=先にpushした方)が第1オペランドである、
という原則に照らすと、厳密にいえば加算も乗算も書き方が逆であるような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 9年前

Re: 逆ポーランド記法を用いた四則演算

#4

投稿記事 by non » 7年前

'2' + '3' = 50 +51 =101
計算はあってる
non

閉鎖

“C言語何でも質問掲示板” へ戻る