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

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

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

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

Q&A

3回答

2976閲覧

c++ スタック 構造体

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/07/03 14:02

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

回答3

0

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

投稿2018/07/03 02:17

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2018/07/02 21:46

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

総合スコア1039

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問