配列のスタック

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

配列のスタック

#1

投稿記事 by Nect » 6年前

お久しぶりです。

 現在、”アルゴリズムとデータ構造”の勉強をしています。使用している書籍は『定本Cプログラマのためのアルゴリズムとデータ構造』です。その書籍のP41に載っているList4.1のプログラムを実行したところ、「stack underflow」と表示されてしまい、何度実行してもその結果は変わりませんでした。P41に「逆ポーランド記法の数式を入力してリターンキーを押すと答えを表示します」と記述してあったのでEnterキーを押してみたものの、答えが表示されませんでした。
 「配列で実現するスタック」を理解したいのでご協力お願いします。

【実行環境】
windows8

コード:

 
/* Page 43 */

/* List 4.1  配列で実現したスタック(逆ポーランド電卓) */

/*
 * stack.c  配列でスタックを実現する
 */

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

typedef	   long	   ELEM;	   /* スタックの要素の型 */

#define	   STACK_SIZE  100	   /* スタックの大きさ */

ELEM   stack[STACK_SIZE];	   /* スタックの定義 */
int    n;			   /* スタックポインタ */


/* エラーメッセージをプリントしてexitする */
void   error(char *s)
{
    fprintf(stderr, s);
    exit(1);
}

/* スタックを初期化する */
void   init()
{
    n = 0;
}

/* スタックにデータを積む */
void   push(ELEM x)
{
    if (n >= STACK_SIZE)
	error("stack overflow\n");
    stack[n++] = x;
}

/* スタックからデータを降ろす */
ELEM   pop()
{
    if (n <= 0)
	error("stack underflow\n");
    return  stack[--n];
}

/* スタックが空かどうかを調べる */
/* 空なら1、空でなければ0を返す */
int    empty()
{
    return  n == 0;
}

/**********************************************************/

/* 逆ポーランド算卓プログラム */

main()
{
    int c;
    long    x, a, b;

    init();
    while ((c = getchar()) != EOF) {
	if (isdigit(c)) {
	    ungetc(c, stdin);
	    scanf("%ld", &x);
	    push(x);
	} else {
	    switch (c) {
	    case '+':
		b = pop(); a = pop();
		push(a + b);
		break;
	    case '-':
		b = pop(); a = pop();
		push(a - b);
		break;
	    case '*':
		b = pop(); a = pop();
		push(a * b);
		break;
	    case '/':
		b = pop(); a = pop();
		push(a / b);
		break;
	    case '\n':
		if (! empty())
		    printf("答えは%ldです\n", pop());
		init();
		break;
	    case ' ':
	    case '\t':
		/* 何もしないで読みとばす */
		break;
	    default:
		printf("不正な文字がありました。\n");
		printf("入力しなおして下さい。\n");
		while ((c = getchar()) != EOF && c != '\n')
		    ;
		break;
	    }
	}
    }
}


Nect

Re: 配列のスタック

#2

投稿記事 by Nect » 6年前

すみません。書き忘れていました。

追記.

どのようにすれば、「stack underflow」と表示せずに計算結果を表示することができますか?

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

Re: 配列のスタック

#3

投稿記事 by box » 6年前

逆ポーランド記法の数式の例を示してください。

こちらの環境(Windows XP、netbeans7.1.2)では、
例えば
2 3 +
と入力すると、想定どおり
答えは5です
と返ってきました。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Nect

Re: 配列のスタック

#4

投稿記事 by Nect » 6年前

box さんが書きました:逆ポーランド記法の数式の例を示してください。

こちらの環境(Windows XP、netbeans7.1.2)では、
例えば
2 3 +
と入力すると、想定どおり
答えは5です
と返ってきました。
5 3 +

4 5 *

7 2 -
と入力しました

Nect

Re: 配列のスタック

#5

投稿記事 by Nect » 6年前

実行結果を添付します。よろしくお願いします。

http://kie.nu/1CS8

初級者
記事: 200
登録日時: 9年前

Re: 配列のスタック

#6

投稿記事 by 初級者 » 6年前

その入力のしかたでは、+などの演算子を
入力したときに演算対象の数値が
スタックに存在していない状態です。
stack underflow
が起きるのは当然です。

5 2 + <enter>
と入力してみてはどうでしょうか。

Nect

Re: 配列のスタック

#7

投稿記事 by Nect » 6年前

初級者 さんが書きました:その入力のしかたでは、+などの演算子を
入力したときに演算対象の数値が
スタックに存在していない状態です。
stack underflow
が起きるのは当然です。

5 2 + <enter>
と入力してみてはどうでしょうか。
実行できました。ありがとうございました。

かずま

Re: 配列のスタック

#8

投稿記事 by かずま » 6年前

Nect さんが書きました:実行できました。ありがとうございました。
3 1 4 2 + <Enter> と入力してみてください。満足できますか?

閉鎖

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