シーケンシャルスタック
1.コンセプト
スタックは1種類仅在表尾进行插入或者删除操作的线性表
です。また、テーブルの最初と最後には特別な意味があります。テーブルの先頭は一般にと呼ばれ栈底
、テーブルの終わり(最後の要素の位置)はと呼ばれ栈顶
、要素のない栈底=栈顶
スタックまたはスタックと呼ばれます空栈
。
したがって、スタックは先进后出
テーブル構造です。この状況は、私たちの列車指令局と非常によく似ています。
2.スタック構造の定義
スタックの内部ストレージ構造はシーケンシャル構造またはチェーン構造を使用できますが、この部分のストレージ方法は前の線形リストおよび単一リンクリストと同様であるため、この記事ではシーケンシャルストレージ方法を採用して実現します。
1.スタック定義
スタックの場合、3つの部分を定義する必要があります。1つはbase
データを基本的な「コンテナ」として格納することです。次にtop
、シーケンステーブルであるため、現在のスタックトップ要素を指すスタックトップポインタが必要です。したがって、境界を越えないように、maxlen
格納するbase
最大の長さも必要です。スタックの最上位へのポインタを取得するためのtop
再形成base+top
メソッドにすることもできます。もちろん、同じクラスとして直接top
宣言してbase
、スタックの最上位にポインタを格納することもできます。元々はシーケンステーブルであるため、単純な方が良いので、プラスチックの方法で保存されます。
2.スタックを初期化します
スタックの初期化では、デフォルトの長さのスペースを申請して割り当てbase
、maxlen
初期化した長さに更新するだけで、最後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;
}
}