一.栈的基本介绍
        栈是一种只能够在一端进行插入和删除的顺序表。如下图
空栈:表示不含任何元素的栈
栈顶:表示允许进行插入和删除元素的一端
栈底:表示不允许进行插入和删除元素的一端
即栈是一种后进先出的线性表数据结构
二.栈的常见操作
StackInit:初始化栈
StackDestory:销毁栈
StackPop:删除栈顶元素
StackPush:向栈顶插入元素
StackSize:计算栈中元素并返回
StackEmpty:判断栈是否为空
StackTop:返回栈顶元素
三.各操作代码实现详解
栈结构的描述代码
typedef int DataType;
typedef struct Stack
{
	DataType* a;    //存储栈的数组
	int Top;        //指向栈顶元素的下标
	int Size;       //栈元素大小
}ST;3.1 StackInit
初始化栈只需要对栈中的三个元素依次初始化即可
//初始化栈
void StackInit(ST* st)
{
	assert(st != nullptr);
	st->a = nullptr;
	st->Top = 0;
	st->Size = 0;
}3.2 StackDestory
//销毁栈
void StackDestory(ST* st)
{
	assert(st != nullptr);
	free(st->a);	//释放数据
	st->Size = 0;	//将容量和栈顶指针置0
	st->Top = 0;
}3.3 StackPop
//删除数据
void StackPop(ST* st)
{
	assert(st != nullptr);
	assert(st->Top > 0);//有数据才能删除
	st->Top--;//直接让Top减少1即可
}3.4 StackPush
//插入数据
void StackPush(ST* st, DataType x)
{
	assert(st != nullptr);
	if (st->Size == st->Top)
	{
		int newCapacity = st->Size == 0 ? 4 : st->Size * 2;//设置新空间大小,每次增长两倍
		DataType* tmp = new DataType[newCapacity];
		for (int i = 0; i < st->Size; i++)
		{
			tmp[i] = st->a[i];
		}
		//C语言方式
		//DataType* tmp = (DataType*)realloc(st->a, sizeof(DataType) * newCapacity);
		
		
		if (tmp == nullptr)
		{
			cout << "new error" << endl;
			exit(-1);
		}
		st->a = tmp;
		st->Size = newCapacity;
	}
	st->a[st->Top] = x;
	st->Top++;
}3.5 StackSize
//计算栈容量大小
int StackSize(ST* st)
{
	assert(st != nullptr);
	assert(st->Top != 0);
	return st->Top;
}
3.6 StackEmpty
//判断栈是否为空
bool StatkEmpty(ST* st)
{
	assert(st->a);
	if (st->Top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}3.7StackTop
//返回栈顶数据
DataType StackTop(ST* st)
{
	assert(st != nullptr);
	assert(st->Top > 0);          //栈顶有元素才能返回
	return st->a[st->Top - 1];    //位置是Top-1的原因是Top从0开始,表示的是栈顶的后一位
}四.简单测试
测试代码1
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"
void test1()
{
	ST st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 9);
	StackPush(&st, 4);
	StackPush(&st, 6);
	StackPush(&st, -1);
	while (!StackEmpty(&st))
	{
		cout << StackTop(&st) << endl;
		StackPop(&st);
	}
}
int main()
{
	test1();
}运行结果

加入pop
#define _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"
void test1()
{
	ST st;
	StackInit(&st);
	StackPush(&st, 1);
	StackPush(&st, 9);
	StackPop(&st);
	StackPush(&st, 4);
	StackPop(&st);
	StackPush(&st, 6);
	StackPush(&st, -1);
	while (!StackEmpty(&st))
	{
		cout << StackTop(&st) << endl;
		StackPop(&st);
	}
}
int main()
{
	test1();
}测试结果




















