スタックの簡単な実装

コンテンツ

スタックの概念と構造

アイコン

分析する

スタックの実装

意味

初期化

破壊する

スタックをプッシュ

ポップ

スタックが空かどうかを確認します

 データ数

スタックの最上位要素にアクセスします

ヘッドファイル

テストファイル 


スタックの概念と構造

片方の固定端でのみ要素の挿入と削除を可能にする特別な種類の線形テーブル。データの挿入と削除が実行される一方の端はスタックの最上位と呼ばれ、もう一方の端はスタックの最下部と呼ばれます。スタック内のデータ要素は、後入れ先出しの原則に従います。

一端を閉じた線形テーブル


プッシュスタック:スタックの挿入操作はプッシュ/プッシュ/プッシュと呼ばれ、プッシュされたデータはスタックの最上位にあります。
ポップ:スタックの削除はポップと呼ばれます。送信データもスタックの最上位にあります

 

アイコン

分析する

スタックは線形リストであり、動的配列を使用するとより適切に実装されます。

動的に開発する必要があり、有効な要素の数、スペース容量、およびスタックの最上位の位置を記録する必要があります。

シーケンステーブルを参照して理解することができますシーケンステーブルの実装-プログラマーが求めた

スタックの実装

意味

開始位置、スタックの最上位位置(添え字で操作)、および容量。

typedef struct Stack
{
	Datatype* a;
	int top;   //栈顶位置
	int capacity;   //容量
}ST;

初期化

開始位置は空で、容量は0で、スタックの最上位は下付き文字0の位置にあります。

//初始化
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

破壊する

開始位置から解放すると、スペースが継続的に開かれるため、開始位置を解放すると、開いているすべてのスペースが解放されます。

容量とスタックトップ0

//销毁
void StackDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

スタックをプッシュ

アサーション後、最初に容量が十分かどうかを確認する必要があります。スペースが十分でない場合は、reallocスペースが必要です。スペースが不十分な場合は、4つのデータ型タイプのスペースが提供されます。0に等しくない場合は、既存のスペースの2倍のサイズが与えられます。

スペースが解決されたら、データを保存し、スタックの最上位を更新します。

//压栈
void StackPush(ST* ps, Datatype x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		ps->a = realloc(ps->a, newcapacity*sizeof(Datatype));
		if (ps->a == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

ポップ

psをアサートする必要があるだけでなく、スタックの最上位も0より大きくなければならないことに注意してください。つまり、スタックは空ではありません。

オープンスペースは連続しており、個別に解放することはできないため、スタックの最上位を直接更新できます。

//出栈
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top>0);
	ps->top--;
}

スタックが空かどうかを確認します

空の場合はtrueを返し、空でない場合はfalseを返します

//判断栈是否为空
bool StackEmpty(ST* ps)
{
	assert(ps);
	//if (ps->top > 0)
	//{
	//	return false;
	//}
	//else
	//{
	//	return true;
	//}
	return ps->top == 0;
}

 データ数

データの数は、スタックの一番上の添え字です。

//数据个数
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

スタックの最上位要素にアクセスします

スタックの最上位要素はスタックの最上位の前の要素であり、top-1はスタックの最上位要素の添え字です。

//访问栈顶数据
Datatype StackTop(ST* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}

ヘッドファイル

#pragma once

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

typedef int Datatype;

typedef struct Stack
{
	Datatype* a;
	int top;   //栈顶位置
	int capacity;   //容量
}ST;

void StackInit(ST* ps);

void StackDestory(ST* ps);

void StackPush(ST* ps,Datatype x);

void StackPop(ST* ps);

//判断栈是否为空
bool StackEmpty(ST* ps);

//数据个数
int StackSize(ST* ps);

//访问栈顶数据
Datatype StackTop(ST* ps);

テストファイル 

#include "Stack.h"


void TestStack()
{
	ST st;
	StackInit(&st);
	StackPush(&st,1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);

	while (!StackEmpty(&st))
	{
		printf("%d ",StackTop(&st));
		StackPop(&st);
	}

	StackDestory(&st);
}



int main()
{
	TestStack();
	return 0;
}

必要に応じてスタックをプッシュおよびポップすることもでき、単純なスタックが実装されます。

 

おすすめ

転載: blog.csdn.net/weixin_53316121/article/details/123744876