栈的概念与结构:
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除操作。进行数据插入的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出原则。
压栈:栈的插入操作叫做压栈,压入的数据在栈顶。
出栈:栈的删除操作叫出栈。出的数据也在栈顶。
栈的实现:
栈的实现一般使用数组和链表实现,相对而言数组的结构更优一些。因为数组在尾上插入的数据代价比较小。
以下为栈的代码实现:
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDateType
typedef struct Stack
{
STDateType *a;
int top;
int capacity;
}ST;
//初始化栈
void StackInit(ST* ps);
//销毁栈
void StackDestory(ST* ps);
//入栈
void StackPush(ST *ps, STDateType x);
//出栈
void StackPop(ST* ps);
//获取栈顶元素
STDateType StackTop(ST* ps);
//获取栈顶有效元素个数
int StackSize(ST* ps);
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(ST* ps);
初始化栈:
void StackInit(ST* ps)
{
assert(ps);
ps->a=NULL;
ps->top=0;
ps->capacity=0;
}
销毁栈:
void StackDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->capacity=0;
ps->top=0;
}
入栈:
void StackPush(ST*ps,STDateType x)
{
if(ps->top==ps->capacity)
{
int newCapacity=ps->capacity==0?4:(2*ps->capacity);
STDateType* tmp=(STDateType*)realloc(sizeof(newCapacity*STDateType));
if(tmp==NULL)
{
printf("realloc is fail\n");
exit(-1);
}
ps->a=tmp;
ps->capacity=newCapacity;
}
ps->a[ps->top]=x;
ps->top++;
}
出栈:
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps)); //防止出栈溢出
ps->top--;
}
获取栈顶元素:
STDateType 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;
}
以上就是对栈的实现与讲解。
感谢老铁看到这里,如果文章对你有用的话请给我一个赞支持一下,感激不尽!
在下才疏学浅,一点浅薄之见,欢迎各位大佬指点。