目录
1.栈![](https://i-blog.csdnimg.cn/blog_migrate/55250cd37eab914647b37ffbacd34287.png)
我们的栈顶元素为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;
}