実現したいこと
以下の問題のプログラムを作成したいです。
スタック1,2があり,図1,2の状態になっている。
• 関数fはスタック1からPopしたデータをそのままスタック2にPushする。
• 関数gはスタック2からPopしたデータを出力する。
s1[4] | |
---|---|
s1[3] | 1 |
s1[2] | 2 |
s1[1] | 3 |
s1[0] | 4 |
図1. スタック1
s2[4] | |
---|---|
s2[3] | |
s2[2] | |
s2[1] | |
s2[0] |
図2. スタック2
このとき,次の機能が実装されているプログラムを作成しなさい。
(1)初期状態の作成
C
1int main(void) 2{ 3 int x; 4 IntStack s1, s2; 5 6 if (Initialize(&s1, 5) == -1) { 7 puts("スタックの生成に失敗しました。"); 8 return 1; 9 } 10 if (Initialize(&s2, 5) == -1) { 11 puts("スタックの生成に失敗しました。"); 12 return 1; 13 } 14 15 Push(&s1, 4); 16 Push(&s1, 3); 17 Push(&s1, 2); 18 Push(&s1, 1);
(2)関数fとgを作成
C
1void f(IntStack *s1, IntStack *s2) 2{ 3 int x; 4 Pop(s1, &x); 5 Push(s2, x); 6} 7 8int g(IntStack *s2) 9{ 10 int x; 11 Pop(s2, &x); 12 return x; 13}
※なお上記のPop、Push内の()の中身は私がこの問題を解いた際に一応入れたものです。間違っているかもしれません。
(3)f,f,g,gの順に実行
[実行結果]
(初期状態)
s1[4]=0 s2[4]=0
s1[3]=1 s2[3]=0
s1[2]=2 s2[2]=0
s1[1]=3 s2[1]=0
s1[0]=4 s2[0]=0
fを実行
s1[4]=0 s2[4]=0
s1[3]=0 s2[3]=0
s1[2]=2 s2[2]=0
s1[1]=3 s2[1]=0
s1[0]=4 s2[0]=1
fを実行
s1[4]=0 s2[4]=0
s1[3]=0 s2[3]=0
s1[2]=0 s2[2]=0
s1[1]=3 s2[1]=2
s1[0]=4 s2[0]=1
gを実行、出力は2
s1[4]=0 s2[4]=0
s1[3]=0 s2[3]=0
s1[2]=0 s2[2]=0
s1[1]=3 s2[1]=0
s1[0]=4 s2[0]=1
gを実行、出力は1
s1[4]=0 s2[4]=0
s1[3]=0 s2[3]=0
s1[2]=0 s2[2]=0
s1[1]=3 s2[1]=0
s1[0]=4 s2[0]=0
2 -> 1の順に出力。
前提
C言語で上記のようなプログラムを作っています。
実行結果がうまく表示されません。
下に実行画面を表示します。
発生している問題・エラーメッセージ
s1[3] = 1 s2[3] = 1 s1[2] = 2 s2[2] = 2 s1[1] = 3 s2[1] = 3 s1[0] = 4 s2[0] = 4 fを実行。 s1[2] = 2 s2[2] = 2 s1[1] = 3 s2[1] = 3 s1[0] = 4 s2[0] = 4 s1[0] = 1 s2[0] = 1 fを実行。 s1[1] = 3 s2[1] = 3 s1[0] = 4 s2[0] = 4 s1[1] = 2 s2[1] = 2 s1[0] = 1 s2[0] = 1 gを実行。出力は2。 s1[0] = 1 s2[0] = 1 gを実行。出力は1。 続行するには何かキーを押してください . . .
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3 4typedef struct { 5 int max; 6 int ptr; 7 int *stk; 8} IntStack; 9 10int Initialize(IntStack *s, int max) 11{ 12 s->ptr = 0; 13 if ((s->stk = calloc(max, sizeof(int))) == NULL) { 14 s->max = 0; 15 return -1; 16 } 17 s->max = max; 18 19 return 0; 20} 21 22int Push(IntStack *s, int x) 23{ 24 if (s->ptr >= s->max) 25 return -1; 26 s->stk[s->ptr++] = x; 27 28 return 0; 29} 30 31int Pop(IntStack *s, int *x) 32{ 33 if (s->ptr <= 0) 34 return -1; 35 36 s->ptr--; 37 *x = s->stk[s->ptr]; 38 s->stk[s->ptr] = 0; 39 40 return 0; 41} 42 43void Print(const IntStack *s) 44{ 45 int i; 46 for(i = s->ptr - 1; i >= 0; i--) { 47 printf(" s1[%d] = %3d s2[%d] = %3d\n", i, s->stk[i], i, s->stk[i]); 48 } 49 putchar('\n'); 50} 51 52void Terminate(IntStack *s) 53{ 54 if (s->stk != NULL) 55 free(s->stk); 56 s->max = s->ptr = 0; 57} 58 59void f(IntStack *s1, IntStack *s2) 60{ 61 int x; 62 Pop(s1, &x); 63 Push(s2, x); 64} 65 66int g(IntStack *s2) 67{ 68 int x; 69 Pop(s2, &x); 70 return x; 71} 72 73int main(void) 74{ 75 int x; 76 IntStack s1, s2; 77 78 if (Initialize(&s1, 5) == -1) { 79 puts("スタックの生成に失敗しました。"); 80 return 1; 81 } 82 if (Initialize(&s2, 5) == -1) { 83 puts("スタックの生成に失敗しました。"); 84 return 1; 85 } 86 87 Push(&s1, 4); 88 Push(&s1, 3); 89 Push(&s1, 2); 90 Push(&s1, 1); 91 92 Print(&s1); 93 printf("fを実行。\n"); 94 f(&s1, &s2); 95 Print(&s1); 96 Print(&s2); 97 printf("fを実行。\n"); 98 f(&s1, &s2); 99 Print(&s1); 100 Print(&s2); 101 printf("gを実行。出力は2。\n"); 102 g(&s2); 103 Print(&s2); 104 printf("gを実行。出力は1。\n"); 105 g(&s2); 106 Print(&s2); 107 108 Terminate(&s1); 109 Terminate(&s2); 110 111 return 0; 112}
試したこと
Terminate関数の作成まではスタックの作成方法のやり方を忠実に行った。
関数fとgの内容を修正し、今までエラーメッセージが出力され、実行画面が表示されなかったところを実行画面が表示されるようになった。
s1とs2の値が変わっていないため、Print関数の内容か、main関数内のPrint関数の使い方に問題があると考えている。

回答2件
あなたの回答
tips
プレビュー