【データ構造学習記録5】-スタック(シーケンシャルスタック)

1.コンセプト

スタックは1種類仅在表尾进行插入或者删除操作的线性表です。また、テーブルの最初と最後には特別な意味があります。テーブルの先頭は一般にと呼ばれ栈底、テーブルの終わり(最後の要素の位置)はと呼ばれ栈顶、要素のない栈底=栈顶スタックまたはスタックと呼ばれます空栈
したがって、スタックは先进后出テーブル構造です。この状況は、私たちの列車指令局と非常によく似ています。

2.スタック構造の定義

スタックの内部ストレージ構造はシーケンシャル構造またはチェーン構造を使用できますが、この部分のストレージ方法は前の線形リストおよび単一リンクリストと同様であるため、この記事ではシーケンシャルストレージ方法を採用して実現します。

1.スタック定義

スタックの場合、3つの部分を定義する必要があります。1つはbaseデータを基本的な「コンテナ」として格納することです。次にtop、シーケンステーブルであるため、現在のスタックトップ要素を指すスタックトップポインタが必要です。したがって、境界を越えないように、maxlen格納するbase最大の長さも必要です。スタックの最上位へのポインタを取得するためのtop再形成base+topメソッドにすることもできます。もちろん、同じクラスとして直接top宣言してbase、スタックの最上位にポインタを格納することもできます。元々はシーケンステーブルであるため、単純な方が良いので、プラスチックの方法で保存されます。
ここに画像の説明を挿入

2.スタックを初期化します

スタックの初期化では、デフォルトの長さのスペースを申請して割り当てbasemaxlen初期化した長さに更新するだけで、最後top=0にポイントされbaseます。

3.スタックを破壊します

free私たちを直接ドロップbase

4.スタックは空ですか

直接判断しますtop==0

5.スタックの長さ

シーケンシャルストレージ構造であるため、テーブル全体をトラバースして直接戻る必要はありませんtop。スタックのトップポインターは、スタックの長さです。

6.スタックの最上位要素

スタックが空でない場合、戻り*(base+top)値は次のようになります。

7.スタックにプッシュします

スタックの最上位のポインター位置を更新し、プッシュする値を割り当てるだけで、要素がスタックにプッシュされます。
もちろん、baseストレージスペースが十分かどうかを判断する必要がありrealloc baseます。十分でない場合でも、範囲外にならないように必要です。私の習慣によれば、私はスタックに入れられた後にチェックして拡張し、マスターの準備ができているのが好きです。

8.ポップ

現在のスタックポインタが指すアドレスの値を返し、を追加し栈顶指针-1ます。

3.コードの実装

原理を知っている限り、実装は比較的簡単なので、コメントを追加する必要はありません。

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

#define OK      1
#define ERROR    0
#define DEFAULT_LEN     20
#define EXTEND_LEN      5

typedef struct elemType{
    
    
    int data;
}elemType;

typedef struct Stack{
    
    
    elemType *base;
    int top;
    int maxlen;
}Stack;

Stack* StackInit(void);
int GetTop(Stack *S, elemType *elem);
int Push(Stack* S, elemType elem);
elemType Pop(Stack* S);
int IsEmpty(Stack *S);

int main()
{
    
    
    Stack* s = StackInit();
    elemType test;
    test.data = 123;
    Push(s,test);
    test.data = 456;
    Push(s,test);
    test.data = 789;
    Push(s,test);
    while(IsEmpty(s) == 0)
    {
    
    
        printf("%d\n", Pop(s).data);
    }

    return 0;
}

Stack* StackInit(void)
{
    
    
    Stack *S = (Stack*)malloc(sizeof(Stack));
    if (S == NULL)
    {
    
    
        return ERROR;
    }
    S->base = (elemType *)malloc(sizeof(elemType)*DEFAULT_LEN);
    S->top = 0;
    S->maxlen = DEFAULT_LEN;
    if (S->base != NULL)
    {
    
    
        return S;
    }   
    else
    {
    
    
        exit(1);
    }
}

int GetTop(Stack *S, elemType *elem)
{
    
    
    if (S->base != NULL && S->top != 0)
    {
    
    
        elem = S->base + S->top;
        return OK;
    }
    else
    {
    
    
        return ERROR;
    }
}

int Push(Stack *S, elemType elem)
{
    
    
    if (S->top < S->maxlen)
    {
    
    
        S->top += 1;
        *(S->base+S->top) = elem;
        if (S->top >= S->maxlen)
        {
    
    
            S->base = (elemType*)realloc(S->base, sizeof(elemType)*(S->maxlen + EXTEND_LEN)); 
            if (S->base != NULL)
            {
    
    
                return OK;
            }
            else
            {
    
    
                exit(1);
            }
            
        }
    }
    else
    {
    
    
        return ERROR;
    }
}

elemType Pop(Stack* S)
{
    
    
    elemType *elem;
    if (S->top > 0)
    {
    
    
        elem = S->base+S->top;
        S->top -= 1;
        return *elem;
    }
    else
    {
    
    
        exit(2);
    }
}

int IsEmpty(Stack *S)
{
    
    
    if (S->top > 0)
    {
    
    
        return 0;
    }
    else
    {
    
    
        return 1;
    }
}

おすすめ

転載: blog.csdn.net/u011017694/article/details/109366590