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

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

ただいまの
回答率

90.54%

  • C++

    3431questions

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

c++ スタック 構造体

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 243
退会済みユーザー

退会済みユーザー

 構造体のスタック

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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2018/07/03 23:02

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

    キャンセル

回答 3

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*--- スタックを実現する構造体 ---*/
typedef struct
{
    int no;
    char name[20];
} Member;

typedef struct
{
    int max;     /* スタックの容量 */
    int ptr;     /* スタックポインタ */
    Member *stk; /* スタック本体 */
} IntStack;

/*--- スタックの初期化 ---*/
int Initialize(IntStack *, int);

/*--- スタックにデータをプッシュ ---*/
int Push(IntStack *s, char *name, int no);

/*--- スタックからデータをポップ ---*/
int Pop(Member **member, IntStack *s);

/*--- スタックの後始末 ---*/
void Terminate(IntStack *);

int main(void)
{
    IntStack s;
    if (Initialize(&s, 4) == -1)
    {
        puts("スタックの生成に失敗しました。");
        return 1;
    }

    char name[20];

    while (1)
    {
        int menu, no;
        char name[20];
        Member *member;
        printf("(1)プッシュ  (2)ポップ (0) 終了:");
        scanf("%d", &menu);
        if (menu == 0)
            break;
        printf("%d\n", menu);
        switch (menu)
        {
        case 1: /*--- プッシュ ---*/
            printf("番号:");
            scanf("%d", &no);
            printf("氏名:");
            scanf("%s", name);
            if (Push(&s, name, no) == -1)
                puts("\aエラ-:プッシュ失敗");
            break;

        case 2: /*--- ポップ ---*/
            if (Pop(&member, &s) == -1)
                puts("\aエラ-:ポップ失敗");
            else
                printf("ポップしたデータは番号%d 名前%sです。\n", member->no, member->name);
            break;
        }
    }
    Terminate(&s);
    return 0;
}
/*--- スタックの初期化 ---*/
int Initialize(IntStack *s, int max)
{
    s->ptr = 0;
    s->max = max;
    s->stk = (Member *)malloc(sizeof(Member) * max);
    return 0;
}

/*--- スタックにデータをプッシュ ---*/
int Push(IntStack *s, char *name, int no)
{
    if (s->ptr >= s->max) /* スタックは満杯 */
        return -1;
    Member *member = s->stk + s->ptr;
    member->no = no;
    strcpy(member->name, name);
    s->ptr++;
    return 0;
}

/*--- スタックからデータをポップ ---*/
int Pop(Member **member, IntStack *s)
{
    if (s->ptr <= 0) /* スタックは空 */
        return -1;

    s->ptr--;
    *member = s->stk + s->ptr;
    return 0;
}

/*--- スタックの後始末 ---*/
void Terminate(IntStack *s)
{
    if (s->stk != NULL)
        free(s->stk); /* 配列を破棄 */
    s->max = s->ptr = 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    スタック構造のpopのやり方が分かりません

    cでのスタック構造のポップのやり方が プログラミングを始めたばかりでよくわからないです。 よろしくお願いします。 #include<stdio.h> #include<s

  • 解決済

    C言語 ポインタ 関数

    ** C言語で引数として3つの整数値 min, max, *pをとり *p の値が min と max の範囲にあればなにもせず, minより小さければ *p の値をminに, m

  • 受付中

    リスト構造と待ち行列

    リスト構造と待ち行列をしたいのですが、よくわかりません。 おすすめのサイトや説明おねがいします。 #include <stdio.h> #include <stdlib.h>

  • 解決済

    C言語: 文字型ポインタの配列

    #include <string.h> int main(void) { int a=0,b=0,c=0; int max = 100; int min

  • 解決済

    スタックのやり方がわかりません。

     前提・実現したいこと c言語でスタックの実現をしようとしています。 ファイルからデータをスタックに格納するところまではできたのですが、スタックからデータをブッシュするのがうまくい

  • 解決済

    二回以上関数を使用するとデータが置き換わってしまいます。

     前提・実現したいこと C言語でスタックを実現する関数を作っています 2回Push関数でスタック内にデータを入れて、Print関数でスタック内を見てみると1回目に入れたはずのデータ

  • 解決済

    ポインタを用いて書き換えるには?

    include <stdio.h> int main(void) { int A, B, max, min; printf("整数1:");   scanf("%d", &A)

  • 解決済

    sscanfの使い方

    sscanf(line,"%*d;%d,%d,%d;",&a1,&a2,&a3); 今上記のプログラムでファイルから値を変数に入れたいのですが、この引数が最初の%*dの値(この場合

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

  • C++

    3431questions

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