数据结构 栈和队列

目录

 1.栈​编辑

初始化

入栈

出栈

销毁栈

获取栈顶元素

判空

Size

mian函数


 1.栈

 

 

 我们的栈顶元素为top,但是它的起始位置在栈底,依次往上加加,每+一次就给它输入一次值,然后把这个值打印出来,最后top会走到栈顶的下一个位置

而我们要出栈数据的话,就top--; 

第一次top--,出栈4,第二次出3,然后2,1.

 

 

链式存储栈顶栈底位置与数组存储正好相反。

用数组的方式敲代码写一个:

typedef int STDatatype;
typedef struct Stack
{
	STDatatype* a;
STDatatype top;
STDatatype capacity;

}ST;

定义结构体,STDatatype* a是数组的头部

初始化


 


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

pst是结构体指针变量,需要判空一下,那为什么不直接malloc呢,因为传过来的是一级指针,这里也是用一级指针接收的,malloc也改变不了实参,除非用二级指针接收

入栈

入栈实际上是怎么入栈的:

top刚开始在栈底的位置,我们入栈是从栈顶开始入栈的,比如有个数组,里面有1,2,3,4.,现在进来一个1,然后就到了top的位置,然后top++,又进来一个2,又到top的位置上……

top=0时存一个栈顶元素,然后top++,再存一个栈顶元素,最后栈顶元素存完了,top的位置在最后一个栈顶元素的下一个位置

而我们最后打印只需要入一个数据打印一次top

//入栈
void STPush(ST* pst,int x)
{
	assert(pst);
	if (pst->capacity == pst->top)//如果数组里面什么都没有,没有栈顶元素也没有容量,也就是top和capacity都=0,,那么就扩容
	{
	int newcapcity = pst->capacity==0?4: pst->capacity*2;//newcapcity=(如果capacity=0就给4个字节,如果capacity有空间,就把这个空间*2倍,capcity因为初始化了所以=0,给4个字节,newcapcity也就等于4.)
int* tmp = (int*)realloc(pst->a,newcapcity * 4);//realloc在ptr指针为空时可以当malloc用,在这里就是开辟了(newcapcity*4)=16个字节空间给tmp用
if (tmp == NULL)
{
	printf("realloc  fail");
}
pst->a= tmp;//把tmp的空间给数组用,也就是数组有16字节空间。
pst->capacity = newcapcity;//把newcapity的空间给capacity,这样capacity就有4个字节空间了,然后newcapacity就有4*2=8的空间.如果capacity4个字节空间不够用那就再调一次STPush(),newcapicty就会再次把值给capacity了,capacity就有8个字节的空间,newcapity就有16字节空间。
	}


pst->a[pst->top]=x;//x就是栈顶元素,把x存入top的位置
pst->top++;//top++
}

出栈

出栈实际上是怎么出栈的

跟入栈刚好相反,我们top--


//出栈
void STPop(ST* pst)
{
	assert(pst);
		assert(!STEmptry(pst));//判空一下,如果没有栈顶元素了,再--,就报错
	pst->top--;    //栈顶元素--就是出栈
}

销毁栈

//销毁栈
void STDeatory(ST* pst)
{
	assert(pst);
	free(pst->a);//释放数组头部就是释放整个数组
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;

}

获取栈顶元素

栈顶元素就是我们所说的top-1

//栈顶
int STtop(ST* pst)
{
	assert(pst);
	assert(!STEmptry(pst));    //如果栈顶元素在栈顶的位置了,再减减就是-1了,就报错
	return pst->a[pst->top - 1];    // 栈顶在栈顶元素-1的位置

}

判空



//判空
bool STEmptry(ST* pst)
{

	assert(pst);
	//第一种方法
	//if (pst->top == NULL)
	//{
	//	return true;
	//}
	//else
	//{
	//	return false;
	//}

	//第二种方法
	return  pst->top == 0;   //判断语句,如果top==0,	两边相等那就为真,return true ,else return false;
}

Size

//数量
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;   
} 

mian函数

#include"Stack.h"

void test()
{

	ST st;
	STInit(&st);
 STPush(&st,1 );
STPush(&st,2);

 STPush(&st,3);
 STPush(&st, 4);



 while (!STEmptry(&(st)))//如果top!=0,那么就把top打印出来
 {
	 printf("%d", STtop(&st));
	 STPop(&st);  //出栈
 }
 STDeatory(&st);


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙鹏宇.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值