C言語スタック(スタック順)

スタック

スタック操作は、操作がスタックの底が許可されていないと呼ばれ、後者は、操作の終了を可能にするために、スタックの最上部と呼ばれる、一方の端部にのみ挿入および欠失を定義されたデータ構造の外に前進され、制限されたリニアテーブルであります

スタック順序(シーケンス構造)

注文スタック:スタック内のデータ要素の連続記憶空間と、より一般的には、順次スタックのアレイによって実現されます

順次記憶構造:要素によって占められる記憶空間が連続していなければならない(連続本明細書では論理的、連続的ではなく、物理的に連続を意味します)

       記憶素子の位置2.論理的な順序で格納されています

 
実施順次スタックは、典型的部分を含みます

コード宣言セクション

書式#include <stdio.hに>
する#include <stdlib.h>に含ま

#define MAX_SIZE 5 / *最大容量スタック* /
* / 0 / *空の空の#define
の#define。* /フル1フル/
使用可能の#define AVAIL -1 / * * /

STAの構造体のtypedef
{
    INT *トップ; / *スタックポインタ* /
    INT *ボトム; / *スタックポインタの終わり* /
    スタック* /の/ *最大容量; INT STACK_SIZEが
スタック};
プッシュ(Pスタック)スタック; / *に* /スタック
空隙DisplyStack(スタックP); / *要素のスタックを横断する* /
スタックポップ(スタックP); / *スタック* /
スタックInitStack(スタックP); / *スタックを初期化する* /
INT StackEmpty(スタックP) ; / * * /スタックが空であるか否かが判定される
(スタックP)INT StackFull; / * / *スタックが満杯であるか否かが判断されます

文のスタック

最初:

。typedefは構造体STA 1
2 {
3 int型スタック[SIZE]; / *要素のスタックの一次元配列を格納* /
4 INTトップ; / *ストア添字* /スタック要素
5}スタック。

(ここで、トップの位置を指すように、スタックの上部のみ、また、二つの変数の塩基を使用することができ、スタックの上から下へのスタック空間のポインティング位置とスタック位置)

第二エッセイは、使用される第二の文:( Benpian方法です)

。typedefは構造体STA 1
2 {
3 int型*トップ; / *スタックポインタ* /
4 * INT底;スタックポインタの/ *終わり* /
5 STACK_SIZEはINTである。スタックの/ *最大容量* /
6}スタック。

第二に、スタックの初期化

/ *機能:スタック初期化* /
スタックInitStack(スタックP)
{
    p.bottom =(INT *)はmalloc(* p.stack_sizeはsizeof(INT));
    IF(p.bottom == NULL)
    {
        のprintf(「初期化失敗したスタックの\ N- ");
        終了(0);
    }
    p.top = p.bottom;
    p.stack_size = MAX_SIZE。

    Pを返します。
}

第三に、スタック(プッシュ)

/ *機能:プッシュ* /
プッシュ(スタックP)をスタック
{
    データをint;
    IF(StackFull(P)==フル)
    {
        のprintf( "スタックが満杯である、プッシュすることはできません");
        Pを返す;
    }
    のprintf( "データ入力してください");
    scanfの(" %のD」、&データ);
    * =データp.top;
    p.top ++;

    Pを返します。
}

第四に、スタック

/ *機能:スタック* /
スタックポップ(スタックP)
{
    IF(StackEmpty(P)==空)
    {
        のprintf( "スタックが空のスタックであり、スタックはできません");
        Pを返します;
    }
    p.top--。
    printf( "ポップの要素:%dは\ nを"、* p.top)。

    Pを返します。
}

(スタックポインタの位置は、それがスタックの要素を指摘するために、スタックに必要p.top--で、スタックポインタの要素です)

第五に、スタックが空であるかどうかを判断します

/ *機能:スタックが空であるかどうかを決定する* /
INT StackEmpty(スタックP)
{
    (p.top == p.bottom)IF
    {
        空返す;
    }
    そうで
    {
        無駄を返します;
    }
}

第六に、スタックが満杯であるかどうかを判断します

/ *機能:スタックが満杯であるかどうかを決定する* /
INT StackFull(スタックP)
{
    IF(p.top - p.bottom == p.stack_size)
    {
        本文返す;
    }
    他
    {
        無駄を返します;
    }
}

七、スタック要素をトラバース

/ *機能:スタック* /の下にスタックの先頭からスタック要素を横断する
空隙DisplyStack(スタックP)
{
    (StackEmpty(P)==空)IF
    {
        のprintf(「スタックのスタックが空である、\ nを横断することはできません」)。
        返す;
    }
    のprintf( "スタック要素:");
    のprintf( "トップ[");
    一方(p.top = p.bottom!)
    {
        p.top--;
        のprintf( "%のD-"、* P .top);
    }
    のprintf( "ボトム\ N-");
}

達成するためにスタック - 完全なコードを

書式#include <stdio.hに>
する#include <stdlib.h>に含ま

#define MAX_SIZE 5 / *最大容量スタック* /
* / 0 / *空の空の#define
の#define。* /フル1フル/
使用可能の#define AVAIL -1 / * * /

STAの構造体のtypedef
{
    INT *トップ; / *スタックポインタ* /
    INT *ボトム; / *スタックポインタの終わり* /
    スタック* /の/ *最大容量; INT STACK_SIZEが
スタック};
プッシュ(Pスタック)スタック; / *に* /スタック
空隙DisplyStack(スタックP); / *要素のスタックを横断する* /
スタックポップ(スタックP); / *スタック* /
スタックInitStack(スタックP); / *スタックを初期化する* /
INT StackEmpty(スタックP) ; / * * /スタックが空であるか否かが判定される
(スタックP)INT StackFull; / * / *スタックが満杯であるか否かが判断されます

メインINT()
{
    Pをスタック。
    文字chを、
   
    p.stack_size = MAX_SIZE。
    P = InitStack(P)。/ *初始化栈* /
    printfの( "あなたは(Y / N)をスタックするプッシュしたいですか?");
    scanf関数( "%のC"、&CH);
    (CH == 'Y' || CH == 'y')の一方
    {
        P =プッシュ(P)。/ *入栈* /
        DisplyStack(P); / *打印栈中元素* /
        printfの( "あなたは(Y / N)をスタックするプッシュしたいですか?");
        scanf関数( "%のC"、&CH);
    }
    のprintf( "あなたは(Y / N)をポップアップ表示したいです");
    scanf関数( "%のC"、&CH);
    一方、(CH == 'Y' || CH == 'Y')
    {
        P =ポップス(P)。
        DisplyStack(P)。

        scanf関数( "%のC"、&CH);
    }

    0リターン;
}
/ *機能:スタックが空であるかどうかを決定する* /
INT StackEmpty(スタックP)
{
    IF(p.top == p.bottom)
    {
        空の戻り;
    }
    他
    {
        無駄を返す;
    }
}
/ *機能:分析スタックが満杯である場合* /
INT StackFull(スタックP)
{
    IF - (p.top p.bottom == p.stack_size)
    {
        フル返す;
    }
    他
    {
        無駄を返す;
    }
}
/ *機能:プッシュ* /
スタックプッシュ(スタックP)
{
    データINT;
    IF(StackFull(P)==フル)
    {
        のprintf( "スタックはプッシュすることができない、完全です")。
        Pを返します。
    }
    のprintf(「を入力してくださいデータ」)。
    scanf関数( "%d個"、&データ)。
    * p.top =データ。
    p.top ++;

    Pリターン;
}
/ *機能:スタック* /
スタックポップ(スタックP)
{
    IF(StackEmpty(P)==空)
    {
        のprintf( "スタックが空のスタックであり、スタックはできないが");
        ; P返す
    }
    P.をtop--;
    のprintf( "ポップの要素:%dは\ nを"、* p.top)。

    Pリターン;
}
/ *機能:スタック初期化* /
スタックInitStack(スタックP)
{
    p.bottom =(INT *)はmalloc(* p.stack_sizeはsizeof(INT));
    IF(p.bottom == NULL)
    {
        printf( "スタックの初期化は、N- \失敗");
        終了(0);
    }
    p.top = p.bottom;
    p.stack_size = MAX_SIZE。

    Pリターン;
}
/ *機能:スタック* /の下にスタックの最上部からスタック要素を横断する
空隙DisplyStack(スタックP)
{
    IF(StackEmpty(P)==空)
    {
        横断しないため、空のスタックのprintf(「スタック\ N- ");
        リターン;
    }
    のprintf("スタック要素: ");
    のprintf("トップ[ ");
    一方(p.top = p.bottom)!
    {
        p.top--;
        のprintf(" %D- 」* p.top);
    }
    のprintf( "N- \底]");
}

二つの方法へのポインタがスタック、一つは後者ポインティング要素(ここでは、これが使用される)、他の点は、スタック内の空の完全な状態の両方が決定され、最上位の要素であるの先頭要素であります、スタックから移動するときにいくつかの違いがあり、スタックポインタをスタック。

おすすめ

転載: www.linuxidc.com/Linux/2019-08/159764.htm