数据结构--栈

本文介绍了栈这一线性数据结构,强调了其先进后出的特性,并通过C语言详细实现了栈的节点结构、初始化、销毁、插入(push)、删除(pop)等基本操作。此外,还提供了检查栈顶元素、获取栈大小以及判断栈是否为空的辅助函数。整体展示了栈在特定场景下的应用和简单实现。
摘要由CSDN通过智能技术生成

目录



一、栈简介

        栈跟顺序表和链表一样也是一种线性表。栈的特性就是“先进后出“,或者说”后进先出“。就如一个羽毛球桶一样最先放进去的羽毛球在最底下,只能把它上边的拿出来才能拿最先放进去的羽毛球。

                                


二、代码实现


1.节点结构

        栈可以用顺序表的结构,以顺序表的头作为栈底,尾作为栈顶。也可以使用单链表,用表头作栈顶,表尾作栈顶。这里使用的是第一种结构。

        跟顺序表的结构差不多,比较特别的是定义一个栈顶,后面的操作只能在栈顶top上。

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;


2.初始化和销毁

        基本上与顺序表相同。top栈顶的设置可以为-1,或0。分别表示指向栈顶元素和栈顶元素的后一个。这两种方式都可以,这里采用top=0的方式。

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

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->top = 0;
	ps->capacity = 0;
}

3.插入和删除

        插入时注意检查内存空间是否充足,这也是设置capacity的原因。

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

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	ps->top--;
}

4.其他接口

        写一些返回栈的简单信息的函数,返回栈顶元素、栈的个数、判断是否为空等。

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}

int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}



总结

        栈的内容比较简单,用顺序表实现就很容易。在某些特定的场合可使用栈这种数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值