首先,我们要搞明白什么是栈?
栈是一种受限线性表,也就是说,栈元素具有线性关系,即前驱后继关系;
只不过它是 一种特殊的线性表而已
那么顺序栈呢?
栈的顺序存储结构简称顺序栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,
同时附设指针top指示栈顶元素在顺序表中的位置。
下面是栈的的实现:
首先先引用一些头文件,后面会用到:
#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h>
#include <assert.h>
这里我们采用用数组对栈的实现(数组相对于链表缓存更加快速!)
typedef char StDateType;
typedef struct Stack
{
StDateType* arr; //栈的主体
int top; //栈顶
int capacity;//栈的容量
}Stack;
现在栈有了,那么怎么实现初始化和栈销毁呢?
//栈的初始化
void StackInit(Stack* B)
{
assert(B);
B->arr = NULL;
B->top = 0;
B->capacity = 0;
}
//栈的销毁
void StackDestory(Stack* B)
{
assert(B);
free(B->arr);
B->arr = NULL;
B->top = B->capacity = 0;
}
好,有了最简单的初始化和销毁,我们接下来的任务就是往栈里放数据了。
void StackPush(Stack* B, StDateType c)
{
assert(B);
if (B->top == B->capacity) //判断是否要增容
{
int newcapacity = B->capacity == 0 ? 4 : B->capacity * 2;
B->arr = (StDateType*)realloc(B->arr, newcapacity * sizeof(StDateType));
if (B->arr == NULL)
{
exit(-1);
}
B->capacity = newcapacity;
}
B->arr[B->top] = c; //存放数据
B->top++; //栈顶位置更新
}
如果我想销毁栈顶数据呢?
很简单,只需要把栈顶的位置往前推一位
void StackPop(Stack* B)
{
assert(B);
assert(B->top>0); //判断栈是否为空,为空肯定不能不能再删除了!
--B->top;
}
其实这里也可以写一个判断是否为空的函数:
bool StackEmpty(Stack* B)
{
return B->top == 0;
}
栈顶位置的数据拿取:
StDateType StackTop(Stack* B)
{
assert(B);
assert(B->top > 0);
return B->arr[B->top - 1];
}
到此,栈的简单实现和应用就完成啦!