• ベストアンサー

スタックを用いたプログラム

http://okwave.jp/qa4433705.html 先日教えて戴いた事でスタックがどういったものなのかは わかりましたが、実際にプログラムを作ってみると、 なかなかうまくいけません。再びアドバイスを戴ければと思ってます。 <プログラムの仕様> 入力数値をスタックに格納し'a'が入力されたら、 スタックに格納されている数値を全て取り出し、 平均値を出力するプログラム ・スタックは、push()関数およびpop()関数を実装する ・スタックへの要素の追加はpush()関数で行う ・スタックからの要素の取出はpop()関数で行う ・スタックのサイズは任意とする int push(int push_data);  引数: スタックに追加するデータ  戻り値: 成功の場合1、失敗の場合0を返す int pop(int *pop_data);  引数: スタックから取り出した値を格納するポインタ  戻り値: 成功の場合1、失敗の場合0を返す いざ、自分で作ってみると、 仕様通りには全く作れず、結局main関数ですべてを作って しまうことになってしまいます・・

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

サンプルです。 コメントが少ないですが、見ればわかると思います。 #include <stdio.h> #define STACK_MAX (100) //100個のスタック int stack[STACK_MAX]; int stack_ctr = 0; //スタックカウンター //1:成功 0:失敗 int push(int push_data) { if (stack_ctr >= STACK_MAX) return 0; stack[stack_ctr] = push_data; stack_ctr++: return 1; } int pop(int *pop_data) { if (stack_ctr == 0) return 0; stack_ctr--; *pop_data = stack[stack_ctr]; return 1; } int main() { int data; ret = push(25); printf("ret=%d\n"); ret = push(251); printf("ret=%d\n"); ret = push(2512); printf("ret=%d\n"); ret = pop(&data); printf("ret=%d data=%d\n"); ret = pop(&data); printf("ret=%d data=%d\n"); ret = pop(&data); printf("ret=%d data=%d\n"); ret = pop(&data); printf("ret=%d data=%d\n"); return 0; }

hardtechno
質問者

お礼

動作結果はおかしいですけど、プログラムの作り方はわかりました。 参考にさせていただきます。

その他の回答 (4)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

#4です。 >動作結果はおかしいですけど、プログラムの作り方はわかりました。 すみません。どこが、おかしいでしょうか。 こちらで、動作確認したものを、提示したつもりです。 できましたら、おかしい点を、補足にお願いします。

hardtechno
質問者

補足

stack_ctr++:      ↑

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

●スタックについての説明をお願いします。 > 先日教えて戴いた事でスタックがどういったものなのかは > わかりましたが、実際にプログラムを作ってみると、 > なかなかうまくいけません。再びアドバイスを戴ければと思ってます。 > 出来あがったのが、mainですべて処理してしまっている、 > というスタックをまるで理解出来てない結果となってしまったので > ソースを公開できる段階ではないです。 どうもスタックがどう言うものか理解してない疑いがありますので、 一度、スタックがどう言うものか自分の言葉で、説明してみてください。 ●スタックの役割 > そもそもスタックなんて使う意味あるのか?と思ってしまうほどです。 こちらの課題におけるスタックを使用する意味などを抑えると、良いのではないでしょうか。 この課題の場合、スタックはどのような役割持ちますか。 ●発展 > が、それではこの後に控えている、同様の宿題が解けないので > 本質問の御回答を理解した後、次の課題に当たりたいと考えています。 丸投げ、丸コピーしただけでは、理解できるとは思えないし、 次の課題へつなげる事も出来ないと思います。 出来る範囲で、努力し、その経過を伝わるようにした方が、課題達成へのヒントも得られると思いますよ。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

> ソースを公開できる段階ではないです。 その公開できない段階のソースをたたき台にして この部分を関数化ししてみては などのアドバイスを期待できるように思います データの追加処理の部分が push関数になるでしょうし データの表示(取得)部が pop関数になりそうです

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

宿題のように見えますが、 まるなげと思われないように、もう1歩踏み込んだ配慮を希望します。 > main()関数ですべて作ってしまうことになります。 とあるので、 一度作ったソースを公開されてみてはどうでしょう? 何かアドバイスできるかもしれません。

hardtechno
質問者

お礼

おっしゃる通り、確かに宿題であり、丸投げであり、 結果的には形はコピペで終わる事になるかと思います。 が、それではこの後に控えている、同様の宿題が解けないので 本質問の御回答を理解した後、次の課題に当たりたいと考えています。

hardtechno
質問者

補足

出来あがったのが、mainですべて処理してしまっている、 というスタックをまるで理解出来てない結果となってしまったので ソースを公開できる段階ではないです。 どのように考えればpush用、pop用に分けられるのか 仕様そのまんまですが、そこがわかりません。 pushでは入力したら=配列に格納だからpushの存在意味があるのか? popでは取り出してmainで平均を出すにしても、取り出すってことは 配列元からは消えるのか?次の数値を取り出す時にはまた関数を頭から呼び出す事で処理が膨大になるのが無駄ではないか?とか、図などのイメージでは容易ですが、それをプログラム化するとなるとうまく書けない、そもそもスタックなんて使う意味あるのか?と思ってしまうほどです。

関連するQ&A