連結リストを用いたスタックの実現方法

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

連結リストを用いたスタックの実現方法

#1

投稿記事 by sign » 14年前

大学生のものです。連結リストを用いた際のスタックの実現方法についての質問をさせていただきます。以下に記述したプログラムを書いたのですが、このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか? よろしければ、教えてください。

コード:

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

typedef struct{
  int size;    /* スタックの大きさ */
  int p;       /* スタックのポインタ */
  int *head;    /* スタック(の先頭要素)へのポインタ */
}stack;

int Stackalloc(stack *s,int size){
  s->p=0;
  if((s->head=calloc(size,sizeof(int)))==NULL){
    s->size=0;      return -1;       /* 配列の確保の失敗 */
  }
  s->size=size;
  return 0;
}

void Stackfree(stack *s){
  if(s->head != NULL){
    free(s->head);
    s->size=s->p=0;
  }
}

int Stackpush(stack *s,int x){
  if(s->p >= s->size)
    return -1;
  s->head[s->p++]=x;
  return 0;
}

int Stackpop(stack *s,int *x){
  if(s->p <=0)
    return -1;
  *x=s->head[--s->p];
  return 0;
}

int StackPeak(const stack *s,int *x){      /* スタックからデータをピーク */
  if(s->p<=0)
    return -1;
  *x=s->head[s->p-1];
  return 0;
}

int Stacksize(const stack *s){
  return (s->size);
}

int Stackno(const stack *s){
  return (s->p);
}

int Stackisempty(const stack *s){
  return (s->p <=0);
}

int Stackisfull(const stack *s){
  return (s ->p >= s->size);
}

void Stackclear(stack *s){         /* スタックを空にする。 */
  s->p=0;
}

int main(void){
  stack s;
  if(Stackalloc(&s,100)==-1){
    puts("スタックの確保に失敗しました。 ");   /* スタックのサイズを100とする。 */
  }
  while(1){
    int a,b,i=0;
    printf("現在のデータ数: %d/%d \n",Stackno(&s),Stacksize(&s));
    printf("1.push()     2.pop()   3.finish\n");
    scanf("%d",&a);
    if(a==3)   break;
     switch(a){
    case 1:printf("データ:");     scanf("%d",&b);
      if(Stackpush(&s,b)==-1)
        puts("スタックへのプッシュに失敗しました。");   break;
    case 2:if(Stackpop(&s,&b)==-1)
        puts("ポップできません。");
      else
        printf("ポップしたデータは%dです。\n",b);   break;

    }

  }
  Stackfree(&s);
  return 0;
}
大変長くなりました。すみません。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 連結リストを用いたスタックの実現方法

#2

投稿記事 by h2so5 » 14年前

sign さんが書きました:このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?
スタックが空になるまでpopして出力すればいいと思います。

box
記事: 2002
登録日時: 14年前

Re: 連結リストを用いたスタックの実現方法

#3

投稿記事 by box » 14年前

sign さんが書きました:このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?
「リスタック」の定義を教えてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

sign

Re: 連結リストを用いたスタックの実現方法

#4

投稿記事 by sign » 14年前

すみません。リスタックはtypeミスです。スタックの事です。

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

Re: 連結リストを用いたスタックの実現方法

#5

投稿記事 by non » 14年前

>出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?

何を付け加えたら?プログラムにですか?
それに、3,5の順番に取り出すのでしょうか?
non

sign

Re: 連結リストを用いたスタックの実現方法

#6

投稿記事 by sign » 14年前

説明不足ですみません。プログラムに何かを付け加えるということです。順番は関係ありません。
けど、スタック内が空になるまでpopを出力することによって解決しました。どうもありがとうございました。
また、他のことを質問するかもしれないので、その時はまたヨロシクお願いします。


閉鎖

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