• ベストアンサー

スタックを用いて整数配列を入れ替えるプログラムがわかりません…!

C言語プログラミングの超初心者です。 「スタックを用いて0~9の10個の整数配列を5個ずつ並び替えるプログラムをつくる」(0123456789→4321098765) という課題に取り組んでいるのですが、 お恥ずかしいのですがスタック・プッシュ・ポップの関係を何とか理解した程度で、どのようにプログラミングを組めばよいのかわかりません…! 上記の課題の前提として、「0~100までの整数の並び順を逆にする」(0 1 2…100→100 99 98…0)が与えられていました。途中で分からなくなってしまっため、恥ずかしながら途中までなのですが、記述させていただきます。こちらのプログラムが参考になるようであれば、使っていただければ幸いです。 #include<stdio.h> #include<stlib.h> #define STACKLENGTH 100 #define LENGTH 10 int stack[STACKLENGTH]; int stack_p = 0; void print(void); void Print(char*,int*a,int); int main(int arg,char** argv){ int a[LENGTH]; int ii; for (ii=0; ii<LENGTH, ii++){ a[ii]= rand()%101; } Print("入れ替え前",a,LENGTH); for(ii=0; ii<LENGTH; ii++){ push(a[ii]); } for (ii=0; ii){ a[ii]=Pop(); } Print("入れ替え後",a,LENGTH ); } お手数をおかけします。とても困っており、ぜひご指導をお願いいたします…!

質問者が選んだベストアンサー

  • ベストアンサー
  • 7o8
  • ベストアンサー率55% (5/9)
回答No.5

課題はスタックを使用することですので、どうスタックを 実現するか?が課題かと思います。 スタック自体が実現できればスタックに入れた(PUSH)した順番でデータを 取得(POP)すれば命題が実現できることになります。 main()内ではそれを実行しているのですが、結構シンプルに 実行できているかとは思います。(自画自賛?) で、スタックの実装ですが、私なら static変数を使用し スタック操作関数を作成します。 グローバル変数としないところがミソです。(^^; 例は汎用性を持たせるために値渡しではなくポインタ渡しにしています。 値が0~10程度(正の整数)であるなら エラーは-1にするなどして 値渡しにすることが可能です。 簡単な動作確認はしていますのでご参考までにどうぞ。 #include <stdio.h> #define STACK_SIZE 50 /* スタックバッファの要素数 */ #define PUSH_DATA 0 /* PUSH操作指示 */ #define POP_DATA 1 /* POP操作指示 */ #define POP_STACK(data) stack_io(POP_DATA,data) /* POP関数 */ #define PUSH_STACK(data) stack_io(PUSH_DATA,data) /* PUSU関数 */ /* io==PUSH_DATAの時、*dataの内容をstackdataに格納 */ /* io==POP_DATAの時、 *dataにstackdataの内容を格納 */ /* statckの上限下限を超えた時エラーリターン */ int stack_io(int io,int *data) { static int stackdata[STACK_SIZE]; static int pos=0; if ( io==PUSH_DATA ) { /* STACKチェック*/ if(pos==STACK_SIZE) { printf( "スタックがいっぱいです。\n" ); return -1; } /* STATCK操作(PUSH)*/ stackdata[pos] = *data; pos++; }else if ( io==POP_DATA) { /* STACKチェック*/ if(pos==0) { printf( "スタックがからっぽです。\n" ); return -1; } /* STATCK操作(POP)*/ pos--; *data = stackdata[pos]; } return 0; } void main() { int a[10]={0,1,2,3,4,5,6,7,8,9}; int i,j; for(i=0;i<5;i++) PUSH_STACK(&a[i]); /* エラー発生は考慮していません*/ for(j=0;j<5;j++) POP_STACK(&a[j]); /* エラー発生は考慮していません*/ for(;i<10;i++) PUSH_STACK(&a[i]); /* エラー発生は考慮していません*/ for(;j<10;j++) POP_STACK(&a[j]); /* エラー発生は考慮していません*/ for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); }

micco80
質問者

お礼

7o8さん、ご回答をありがとうございます…! ほとんど概念も理解できないまま困っていたのですが、 ご丁寧な解説までつけていただき、ありがとうございます! 早速、プログラムを実行し、動作を確認いたします。 お恥ずかしいのですが超がつくほどの初心者で、 またご質問させていただく機会があるかと思いますが、 そのときはぜひ、またご指導いただければ幸いです。 本当に、ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#144013
noname#144013
回答No.4

#3です。 すみません、#3で以下の訂正があります。 ============================== <誤>    struct T_STACK {        /* スタックデータ構造体 */      int nPos;            /* スタックバッファ上のデータ格納位置      int nData[STACK_SIZE];  /* スタックバッファ */    } t_stack; <正>    struct T_STACK {        /* スタックデータ構造体 */      int nPos;            /* スタックバッファ上のデータ格納位置 */                         ↑※コメントが閉じていませんでした。      int nData[STACK_SIZE];  /* スタックバッファ */    } t_stack; ============================== <誤>    for( i=0; i<STACK_SIZE; i;+ ){      t_stack.nData[i] = 0;    } <正>    for( i=0; i<STACK_SIZE; i++ ){  /* ←※ i++ が正しいです */      t_stack.nData[i] = 0;    } ============================== <誤>    for( i=0; i<5; i++ ){      iret = PushNum( &t_stack, nArray[i] );      if( iret == STACK_FULL ){        printf( "スタックがいっぱいです。\n" );        break;      }    } <正>    for( i=0; i<5; i++ ){  /* ←※ { が全角になっていました */      iret = PushNum( &t_stack, nArray[i] );      if( iret == STACK_FULL ){        printf( "スタックがいっぱいです。\n" );        break;      }    } ============================== <誤>    int num;    for( i=0; i<10; i++ ){      num = PopNum( &t_stack );      if( num == STACK_EMPTY ){        printf( "スタックが空きです。\n" );        break;      }      nArray[i] = num;    } <正>    int num;    for( i=0; i<10; i++ ){  /* ←※ { が全角になっていました */      num = PopNum( &t_stack );      if( num == STACK_EMPTY ){        printf( "スタックが空きです。\n" );        break;      }      nArray[i] = num;    } ============================== 以上です。大変失礼致しました。

micco80
質問者

お礼

FarEyesさん、早速のご回答をありがとうございます…! ご丁寧な解説までつけていただき、 本当にありがとうございます! 作成いただいたプログラムを実行すると同時に FarEyesさんの解説を熟読し、 少しでも上達できるよう、頑張ります! お恥ずかしいのですが超がつくほどの初心者で、 また改めてご質問させていただく機会があるかと思いますが、 そのときはぜひ、またご指導いただければ幸いです。 本当に、ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
noname#144013
noname#144013
回答No.3

こんにちは。 > 「スタックを用いて0~9の10個の整数配列を5個ずつ並び替えるプログラムをつくる」 > (0123456789→4321098765) この処理を下記のように解釈したとして、 (的外れだった場合はすみません。)  <スタックにPUSHする数値データの順番>   1)後半の5個 → 5、6、7、8、9       ↓   2)前半の5個 → 0、1、2、3、4  <スタックからPOPしたときの数値データの順番>   4、3、2、1、0、9、8、7、6、5 その処理手順は、 1)スタック用のバッファ(例えば下記のような構造体)と数値データ用の   要素数10個の整数配列を用意する。   <例>    #define STACK_SIZE 50       /* スタックバッファの要素数 */    #define STACK_EMPTY 0x8000   /* スタックが空きのときの判定値 */    #define STACK_FULL -1       /* スタックがフルのときの判定値 */    struct T_STACK {        /* スタックデータ構造体 */      int nPos;            /* スタックバッファ上のデータ格納位置      int nData[STACK_SIZE];  /* スタックバッファ */    } t_stack;    int nArray[10];          /* 数値データ用の配列 */   <補足>    #define定義の STACK_EMPTY の値は仮の値です。    ※スタックバッファに格納する数値データの範囲外の値を想定しています。 2)スタックバッファをクリアする。   <例>    int i;    for( i=0; i<STACK_SIZE; i;+ ){      t_stack.nData[i] = 0;    }    t_stack.nPos = STACK_SIZE; /* スタックを空き状態にする */    注)↑この場合のスタックバッファの使い方は、格納位置の大きい方から      小さい方へデータを格納していく方法をとっています。 3)数値データ配列に0~9の数値を順番に格納する。   <例>    for( i=0; i<10; i++ ){      nArray[i] = i;    } 4)数値データ配列の後半5個を順番にスタックにPUSHする。   <例>    int iret;    for( i=0; i<5; i++ ){      iret = PushNum( &t_stack, nArray[i+5] );      if( iret == STACK_FULL ){        printf( "スタックがいっぱいです。\n" );        break;      }    }    ※PushNum()は指定のスタックへ、指定の数値をPUSHする関数。     (この関数は自前で用意する。) 5)数値データ配列の前半5個を順番にスタックにPUSHする。   <例>    for( i=0; i<5; i++ ){      iret = PushNum( &t_stack, nArray[i] );      if( iret == STACK_FULL ){        printf( "スタックがいっぱいです。\n" );        break;      }    } 6)スタックから格納された10個の数値を順番に取り出し、数値データ配列   に再格納する。   <例>    int num;    for( i=0; i<10; i++ ){      num = PopNum( &t_stack );      if( num == STACK_EMPTY ){        printf( "スタックが空きです。\n" );        break;      }      nArray[i] = num;    }    ※PopNum()は指定のスタックから数値を1個、POPする関数。     (この関数は自前で用意する。) <PushNum関数の形式、動作>  プロトタイプ: int PushNum( struct T_STACK *t_stack, int nData );           t_stack : スタックデータ構造体へのポインタ           nData  : 格納するデータ           戻り値  : 正常時は=0                  スタックがフルの時は、STACK_FULL  1)指定のスタックがフルでないか(nPos==0?)をチェックする。    ・フルだった場合は、戻り値を STACK_FULL として戻る。  2)データ格納位置を-1する。  3)スタックバッファのデータ格納j位置に、指定のデータを格納する。  4)戻り値を 0 で返す。 <PopNum関数の形式、動作>  プロトタイプ: int PopNum( struct T_STACK *t_stack );           t_stack : スタックデータ構造体へのポインタ           戻り値  : 正常時はスタックから取り出したデータ                  スタックが空きの時は、STACK_EMPTY  1)指定のスタックが空きでないか(nPos==STACK_SIZE?)をチェックする。    ・空きだった場合は、戻り値を STACK_EMPTY として戻る。  2)スタックバッファからデータ格納位置のデータを取り出し、別変数に保存する。  3)データ格納位置を+1する。  4)2)で保存しておいたデータを戻り値として返す。 以上のようなものになるかと思います。(※上記はあくまで一例です。) 参考になれば幸いです。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

スタックでは、popすると一番最後にpushしたデータが取り出されます。本を積み重ねていったあと、本を取り出していくこと同じです。つまり、一番最後に積んだ本から順番に取り出される訳です。 ということで、元配列の内容を5個ずつpushしてはpopして表示する(あるいはpopして別配列にセットしていく)プログラムを組めばよいのではないでしょうか?

micco80
質問者

お礼

cyacya2000さん、ご回答をありがとうございます。 popとpushの概念を分かりやすく説明いただいたおかげで、 少しずつ構造が分かってきました…!よく復習いたします。 ご丁寧な説明をありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

スタックの課題を作るにしても, もっとましな課題を作ってほしいなぁと思ったりしつつ: 1. スタックがどういうものかはわかっていますか? 2. プッシュ・ポップの動作は分かりますか? 3. n個のデータを連続してプッシュし, その後ただちに n個のデータを連続してポップしたとしましょう. プッシュしたデータの順番とポップしたデータの順番はどのような関係にあるか分かりますか?

micco80
質問者

お礼

Tacosanさん、さっそくのご回答ありがとうございます…! 申し訳ありません…よく分かっておらず自信がないのですが、分かる限りで回答させていただきます。 1.スタックは、データの出し入れをする場所 2.プッシュはスタックにデータを挿入すること、   ポップはデータをスタックから取り出すこと 3.プッシュするとデータは1番上に置かれていき、古いデータは底に、最新のデータはスタックの頂上にあるので… すみません、分かりません…!順番の関係はどのようになるでしょうか?  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スタックの配列プログラム

    スタックを配列で実現するプログラムとして #include<stdio.h> #define stack_size 100 #define stack_el_type int stack_el_type stack[stack_size]; int sp; void init_stack() { sp=-1 } void push(stack_el_type x) { if (sp < stack_size -1) stack[++sp] = x; else{ printf("stack full error.\n"); exit(1); } } stack_el_type pop() { if(sp >= 0 ) return stack[sp--]; else { printf("stack empty error.\n") exit(1); } } 上の完成形を参照として、 他の作り方として int stack[100] int sp void push(int x) int pop() を用いて作成する場合どのようにすればよいのでしょうか? またスタックを一方向リストで実現するプログラムを作成するとき struct node{ int data; struct node *next; } struct node *push(int x,struct node *root) struct node *pop(struct node *root) を用いて作成する場合どのようにすればよいのでしょうか? よろしければご教授お願いします

  • スタックのプログラムを作成しているのですが、うまく出来ません。

    プログラムの内容を簡単に言うと、配列s[100]と変数topを用いて、ファイルdata.datからgetc()を用いて文字を1文字ずつ読み込み、スタック(s[100])にpush-downするプログラムです。 細かく言うと、作成したプログラムによりファイルからキー(文字)を読み込みスタックにpush-downし、スタックの内容を表示した後に、キーボードからキー(文字)を1文字ずつ入力して、スタックを操作する。 ・スタック操作の仕様はキーボードからキー(文字)を1文字ずつ入力する際に、0を入力した場合、プログラム終了。1を入力した場合、1文字pop-upした後、pop-upした文字とスタックの内容を表示。その他の文字を入力した場合、その文字をpush-downした後、スタックの内容を表示。(スタックの内容の表示はprint_stack_mtrx(s,top)を使用する。) ・push-downとpop-upはそれぞれ1つの関数で定義する。 といった感じのプログラムを作成しているのですが、関数push,popの部分をどう書いたら良いのか良く分かりません。一応自分で書いてみたのですが、うまくいきませんでした。どなたか教えていただけないでしょうか? *ファイルdata.datからはリダイレクションを用いて読み込む。 <作成途中のソースプログラム> #include<stdio.h> #include<stdlib.h> #define MAX 100 char s[MAX]; int top; void init_stack(){ ______top = 0; _______return; } void print_stack_mtrx(char* s, int top){ __int i; ____if(top == 0){ ______printf("Stack is empty.\n"); ____} ____else{ ______printf("--- Contents of Stack ---\n"); ______for(i = 0; i < top; i++){ ________if(!i){ __________printf("%2c < -- Top (%2d)\n", s[top - i - 1], top); ________} ________else{ __________printf("%2c \n", s[top - i - 1]); ________} ______} ______printf("-------------------------\n"); ____} } char push(char* s, int top, char j){ ___s[top]=j; ___top++; } char pop(char* s, int top){ _char c; ___c = s[top]; ___top--; ___return c; } int main(void) { _int c; _char j; _char i; init_stack(); _______while(((c=getc(stdin))!=EOF) && top<MAX){ _______/* ファイルdata.dat からgetc()を用いて1文字ずつ読み込みスタックsに格納.ただしスタックの出入り口を示す top の値も監視すること*/ _________s[top] = c; _________top++; _______} _______print_stack_mtrx( s, top );/* スタック(配列)の内容を表示する関数*/ _______while(1){ _________scanf("%c\n", &j); _________if(j=='0'){ ___________break; _________} _________else if(j=='1'){ ___/* 1文字pop-upした後, pop-upした文字とスタックの内容を表示 */ ___________i = pop(s, top); ___________printf("pop-upした文字: %c\n", i); ___________print_stack_mtrx( s, top ); _________} _________else{ ___/* その他の文字を入力した場合, その文字をpush-downした後,スタックの内容を表示 */ ___________push(s, top, j); ___________print_stack_mtrx( s, top ); _________} _______} _______return 0; }

  • クラス→スタックを使う

    初歩的なとこですがすでに着いていけず困っています。 問題は、  下記のプログラムにおいて、スタックへ整数10を入れるには、push(10)としてメソッドpushを呼び出す。逆に、スタックから値を取り出すには、pop()メソッドを呼び出す。また、現在のスタックの先頭位置(スタックポインタsp)は、メソッドgetSP()を呼び出すことで得られる。今、整数10と20をこの順にスタックへ入れた後、スタックから先頭の要素(整数)を取り出す。ただし、取り出した値は出力する必要はない。そして、これらの操作(3回ある)が終わる毎に、その時のスタックポインタspの値を出力する。  このような動作をするようにmainメソッドを完成させ、実行結果を確かめなさい。 class Stack { int [] stack = new int[10]; int sp = 0; void push(int n){ if(sp < stack.length){ stack[sp] = n; sp++; } } void pop(){ if(sp > 0)sp--; } int getSp(){ return sp; } public static void main(String[] args){ // <この部分を完成させなさい> } } 宜しくお願いします!!  

    • ベストアンサー
    • Java
  • プログラムの最適化について質問です。

    プログラムの最適化について質問です。 /* 課題7 */ #include<stdio.h> #define A n /* n=10^0~9 */ void main() { int a,x; for(a=0;a<A;a++){ x=x+1; } } /* 課題8 */ #include<stdio.h> #define A n /* n=10^0~9 */ void main() { int a,x; for(a=0;a<A;a++){ x++; } } 課題7に比べて課題8の記述のメリットとして、単にソースコードを短くできる以外に、何が考えられるか。 という質問に対しての答えが分かりません。解説お願いします。

  • スタックのデータ構造を作りたい

    C言語でスタックと、スタックにデータを入れるプッシュ、取り出すポップを作りたいと思っており そこで以下のようなものを作ってみました。 ********************************************** #include<stdio.h> typedef struct{ int a[100]; int head=0; }Stack; void push(Stack stc,int x){ stc.a[head]=x; stc.head++; } int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } int main void{ int j; Stack s; push(s,5); push(s,90); j=pop(s); printf("%d",j); j=pop(s); printf("%d",j); return 0; } ****************************** コンパイルするとエラーが出まくりです。 何をどう直せばよいのか、どこが変なのかご教授いただきたいです。 よろしくお願いいたします。

  • プログラムについて

    今スタっクのファイルから読み込んだ文字列をスタっクへプっシュしたりポっプしたりする過程がわかるプログラムを作ってます 。 作りかけのプログラムですがどこをどうすればいいか教えてください!! 一応コンパイルできます。 使ってない関数があるかもしれません。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックのサイズ */ int ptr; /* スタックポインタ */ char *stk; /* スタック(の先頭要素へのポインタ) */ } Stack; /*--- スタックの初期化 ---*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の確保に失敗 */ return (-1); } s->max = max; return (0); } /*--- スタックの後始末 ---*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*--- スタックにデータをプッシュ ---*/ int StackPush(Stack *s, int x, int i,char *a[]) { if (s->ptr >= s->max) return (-1); if(x>=i) { puts("プッシュできる文字データはありません。"); return (-1); } strcpy(&s->stk[s->ptr++],&(*a)[x]); x++; return x; } /*--- スタックからデータをポップ ---*/ int StackPop(Stack *s, int x,char *a[]) { if (s->ptr <= 0) /* スタックは空 */ return (-1); strcpy(&s->stk[--s->ptr],&(*a)[x]); return (0); } /*--- スタックからデータをピーク ---*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*--- スタックの大きさ ---*/ int StackSize(const Stack *s) { return (s->max); } /*--- スタックに積まれているデータ数 ---*/ int StackNo(const Stack *s) { return (s->ptr); } /*--- スタックは空か ---*/ int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } /*--- スタックは満杯か ---*/ int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } /*--- スタックを空にする ---*/ void StackClear(Stack *s) { s->ptr = 0; } int main(void) { int i=0,j,ret,x=0; char *a[NUMBER]; char buffer[20]; FILE *fpin; Stack s; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } strcpy(&a[i][0],&buffer[0]); /*ret=sscanf(&buffer[0],"%s",&a[i][0]); //データ文字列を3分割 if(ret!=1) //1に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; }*/ i++; } for(j=0; j<i; j++) printf("%s\n",&(*a)[j]); if (StackAlloc(&s, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m; printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: printf("データ:"); puts("こんちくしょ~"); if(StackPush(&s, x,i,&(*a)) == -1) puts("スタックへのプッシュに失敗しました。"); break; case 2: if(StackPop(&s, x,&(*a)) == -1) puts("ポップできません。"); else printf("ポップしたデータは%sです。\n", &s.stk[s.ptr]); break; } } StackFree(&s); END: fclose(fpin); return (0); }

  • ArrayList でスタックを

    初歩的でツマラナイかもしれません。 import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。 フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。 MyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MyStack {   private ArrayList<Integer> stack = new ArrayList<Integer>();      // データを先頭に追加   public void push( int item ) {     stack.add( item );   }   // 先頭のデータを取り出す   public int pop( ) {     int rtn;     if( stack.isEmpty() ) {       System.out.println( "スタックは空です." );       System.exit( 1 );     }          rtn = stack.get( 0 );     stack.remove( 0 );     return rtn;   } } このMyStackを実行するクラス"MainForMyStack"を書きます。 実行結果は、標準出力に 43210 と出ることを想定しています。 MainForMyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MainForMyStack {   public static void main(String[] args) {     MyStack stack = new MyStack();     // 0,1,2,3,4 をスタックに追加     for( int i=0; i < 5; i++ ) {       stack.push( i );     }     // スタックのデータを先頭から取り出す     for( int i=0; i < stack.size(); i++ ) {       System.out.print( stack.pop() );     }   } } さて、MainForMyStack.java の i < stack.size(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

    • ベストアンサー
    • Java
  • スタックについて

    スタックを実現するプログラムを作っているのですが、実行するとセグメテーション違反が表示されます。でもどこが間違っているのかわかりません!どうしたらいいのでしょう? #include<stdio.h> #include<stdlib.h> struct stack{ int max; int used; int *array; }; struct stack * stack_create(int n) { struct stack *s; int i; s->array=(int *)malloc(sizeof(int)*n); s->used=0; s->max=n; return 0; } void stack_free(struct stack *s) { free(s); } int stack_push(struct stack *s,int datum) { if(s->used>=s->max){ return 0; } s->array[s->used]=datum; s->used++; return 1; } int stack_pop(struct stack *s,int *datump) { if(s->used<=0){ return 0; } *datump=s->array[s->used-1]; s->used--; return 1; } int stack_is_empty(const struct stack *s) { return s->used==0; } int main() { struct stack s; int i,p; int n; scanf("%d",&n); stack_create(n); for(i=0;i<=5;i++){ stack_push(&s,i); printf("push%2d\n",i); } for(i=1;i<=3;i++){ stack_pop(&s,&p); printf("pop%2d\n",p); } }

  • コンパイルできるのですが実行途中でエラーが

    #include<iostream> #include<cstdlib> using namespace std; class stack{ char *stck; int tos; int size; public: stack(char c); void push(char ch); char *pop(); ~stack(); }; stack::stack(char c){ tos=0; stck=(char*)malloc(c); size=c; cout<<"生成スタック\n"; if(!stck){ cout<<"メモリ割り当てエラー\n"; exit(1); } } void stack::push(char ch){ if(tos==size){ cout<<"スタックは一杯です\n"; return; } *stck=ch; stck++; tos++; } char *stack::pop(){ if(tos==0){ cout<<"スタックは空です\n"; return 0; } stck--; tos--; return stck; } stack::~stack(){ free(stck); } int main(){ stack s1(10),s2(10); int i; char *o; s1.push('a'); s2.push('x'); s1.push('b'); s2.push('y'); s1.push('c'); s2.push('z'); for(i=0;i<5;i++){ o=s1.pop(); cout<<"s1をポップする"<<*o<<"\n"; } for(i=0;i<5;i++){ o=s2.pop(); cout<<"s2をポップする"<<*o<<"\n"; } return 0; } なんですが、実行した所 生成スタック 生成スタック s1をポップするc s1をポップするb s1をポップするa スタックは空です までで止まってしまいます。 たぶんreturn 0の戻り値の型がポインタだから止まってしまうのだろうと思います。 正しく実行するにはどうすればいいのでしょうか? お願いします。

  • c言語 スタックの標準入力の課題です

    c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }