ページ 11

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

Posted: 2011年6月11日(土) 18:28
by sign
大学生のものです。連結リストを用いた際のスタックの実現方法についての質問をさせていただきます。以下に記述したプログラムを書いたのですが、このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、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;
}
大変長くなりました。すみません。

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

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

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

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

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

Posted: 2011年6月11日(土) 18:45
by sign
すみません。リスタックはtypeミスです。スタックの事です。

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

Posted: 2011年6月11日(土) 19:05
by non
>出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?

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

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

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

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

Posted: 2011年6月11日(土) 19:18
by sign
解決しました。