質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

受付中

c++ スタック 構造体

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3回答

0グッド

0クリップ

2623閲覧

投稿2018/07/02 16:28

構造体のスタック

Visual Studio 2012を使ってc言語のプログラミングの勉強をしているのですが、構造体をスタックする方法がわかりません。

数字と名前を入力してその両方を構造体にする。
その構造体をスタックできるようにしたいです。

c++

#include <stdio.h> #include <stdlib.h> /*--- スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ Member *stk; /* スタック本体(の先頭要素へのポインタ) */ } IntStack; typedef struct { int no; char name[20]; } Member; /*--- スタックの初期化 ---*/ int Initialize(IntStack*, int); /*--- スタックにデータをプッシュ ---*/ int Push(IntStack *s, Member x); /*--- スタックからデータをポップ ---*/ int Pop(IntStack *s, Member *x); /*--- スタックの後始末 ---*/ void Terminate(IntStack*); int main(void) { IntStack s; if (Initialize(&s, 64) == -1) { puts("スタックの生成に失敗しました。"); return 1; } char name[20]; while (1) { int menu, x; printf("(1)プッシュ (2)ポップ (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /*--- プッシュ ---*/ printf("番号:"); scanf_s("%d", &x); printf("氏名:"); scanf_s("%d", &s); if (Push(&s, x) == -1) puts("\aエラ-:プッシュ失敗"); break; case 2: /*--- ポップ ---*/ if (Pop(&s, &x) == -1) puts("\aエラ-:ポップ失敗"); else printf("ポップしたデータは%dです。\n", x); break; } } Terminate(&s); return 0; } /*--- スタックの初期化 ---*/ int Initialize(IntStack *s, int max){ s->ptr = 0; if ((s->stk =(int*) calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の生成に失敗 */ return -1; } s->max = max; return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(IntStack *s, int x) { if (s->ptr >= s->max)/* スタックは満杯 */return -1; s->stk[s->ptr++] = x; return 0; } /*--- スタックからデータをポップ ---*/ int Pop(IntStack *s, int *x) { if (s->ptr <= 0)/* スタックは空 */return -1; *x = s->stk[--s->ptr]; return 0; } /*--- スタックの後始末 ---*/ void Terminate(IntStack *s) { if (s->stk != NULL) free(s->stk); /* 配列を破棄 */ s->max = s->ptr = 0; }

補足情報(FW/ツールのバージョンなど)

OS windows10
環境 visual studio 2012

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

pepperleaf

2018/07/03 14:02

ざっと見てみたのですが、Visual Studio でビルド(コンパイル)すると、エラーとか警告とか一杯出ませんか? まず、それを読むことから、お薦めします。

回答3

2

直接の回答ではありません。
勉強中ということなので、行き詰まった時などの参考になれば。
C++ スタックとキュー 書いて覚えるための初心者自己中記事
C++で速度だけを気にしてスタックとキューを作製する

投稿2018/07/03 02:17

sazi

総合スコア24562

junnnnchan👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

まず、Initialize関数が意味不明ですね
Memberを確保しなければいけないのに、なんで

if ((s->stk =(int*) calloc(max, sizeof(int))) == NULL) {

となるんでしょう
このスタックのナカミはMemberなのかintなのかどっちなんでしょう

投稿2018/07/02 21:46

y_waiwai

総合スコア86013

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

その構造体をスタックできるようにしたいです。

できるようにしてみました。エラー処理は一切行っておりませんのでご注意ください。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5/*--- スタックを実現する構造体 ---*/ 6typedef struct 7{ 8 int no; 9 char name[20]; 10} Member; 11 12typedef struct 13{ 14 int max; /* スタックの容量 */ 15 int ptr; /* スタックポインタ */ 16 Member *stk; /* スタック本体 */ 17} IntStack; 18 19/*--- スタックの初期化 ---*/ 20int Initialize(IntStack *, int); 21 22/*--- スタックにデータをプッシュ ---*/ 23int Push(IntStack *s, char *name, int no); 24 25/*--- スタックからデータをポップ ---*/ 26int Pop(Member **member, IntStack *s); 27 28/*--- スタックの後始末 ---*/ 29void Terminate(IntStack *); 30 31int main(void) 32{ 33 IntStack s; 34 if (Initialize(&s, 4) == -1) 35 { 36 puts("スタックの生成に失敗しました。"); 37 return 1; 38 } 39 40 char name[20]; 41 42 while (1) 43 { 44 int menu, no; 45 char name[20]; 46 Member *member; 47 printf("(1)プッシュ (2)ポップ (0) 終了:"); 48 scanf("%d", &menu); 49 if (menu == 0) 50 break; 51 printf("%d\n", menu); 52 switch (menu) 53 { 54 case 1: /*--- プッシュ ---*/ 55 printf("番号:"); 56 scanf("%d", &no); 57 printf("氏名:"); 58 scanf("%s", name); 59 if (Push(&s, name, no) == -1) 60 puts("\aエラ-:プッシュ失敗"); 61 break; 62 63 case 2: /*--- ポップ ---*/ 64 if (Pop(&member, &s) == -1) 65 puts("\aエラ-:ポップ失敗"); 66 else 67 printf("ポップしたデータは番号%d 名前%sです。\n", member->no, member->name); 68 break; 69 } 70 } 71 Terminate(&s); 72 return 0; 73} 74/*--- スタックの初期化 ---*/ 75int Initialize(IntStack *s, int max) 76{ 77 s->ptr = 0; 78 s->max = max; 79 s->stk = (Member *)malloc(sizeof(Member) * max); 80 return 0; 81} 82 83/*--- スタックにデータをプッシュ ---*/ 84int Push(IntStack *s, char *name, int no) 85{ 86 if (s->ptr >= s->max) /* スタックは満杯 */ 87 return -1; 88 Member *member = s->stk + s->ptr; 89 member->no = no; 90 strcpy(member->name, name); 91 s->ptr++; 92 return 0; 93} 94 95/*--- スタックからデータをポップ ---*/ 96int Pop(Member **member, IntStack *s) 97{ 98 if (s->ptr <= 0) /* スタックは空 */ 99 return -1; 100 101 s->ptr--; 102 *member = s->stk + s->ptr; 103 return 0; 104} 105 106/*--- スタックの後始末 ---*/ 107void Terminate(IntStack *s) 108{ 109 if (s->stk != NULL) 110 free(s->stk); /* 配列を破棄 */ 111 s->max = s->ptr = 0; 112} 113

投稿2018/07/03 05:47

tatamyiwathy

総合スコア1026

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。