#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;
}
連結リストを用いたスタックの実現方法
連結リストを用いたスタックの実現方法
大学生のものです。連結リストを用いた際のスタックの実現方法についての質問をさせていただきます。以下に記述したプログラムを書いたのですが、このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか? よろしければ、教えてください。
大変長くなりました。すみません。
Re: 連結リストを用いたスタックの実現方法
スタックが空になるまでpopして出力すればいいと思います。sign さんが書きました:このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?
Re: 連結リストを用いたスタックの実現方法
「リスタック」の定義を教えてください。sign さんが書きました:このプログラムの出力結果に最終的にリスタックにおいてのリストの中に含まれる値(例えば、push(3),push(5),push(7),pop と言ったときに出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 連結リストを用いたスタックの実現方法
>出力結果として3,5という値)を出すには何を付け加えたらよろしいでしょうか?
何を付け加えたら?プログラムにですか?
それに、3,5の順番に取り出すのでしょうか?
何を付け加えたら?プログラムにですか?
それに、3,5の順番に取り出すのでしょうか?
non
Re: 連結リストを用いたスタックの実現方法
説明不足ですみません。プログラムに何かを付け加えるということです。順番は関係ありません。
けど、スタック内が空になるまでpopを出力することによって解決しました。どうもありがとうございました。
また、他のことを質問するかもしれないので、その時はまたヨロシクお願いします。
けど、スタック内が空になるまでpopを出力することによって解決しました。どうもありがとうございました。
また、他のことを質問するかもしれないので、その時はまたヨロシクお願いします。