什么是栈?
堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
知道了栈之后怎么用c语言实现?
首先当然是先建立一个栈的结构体:
typedef struct Stack
{
int* a; // 数组
int top; // 栈顶
int capacity; // 容量
}Stack;
我们的栈中可能存放整数当然也可能存放其他类型的数据,所以我们将我们需要的数据类型进行一个typtdef,方便我们之后的更改类型:
typedef int STDataType;
typedef struct Stack
{
STDataType* a; // 数组
int top; // 栈顶
int capacity; // 容量
}Stack;
当我们构建完栈的框架后就要想一想栈的各个功能了
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);
栈的一些基本功能就是这些了
接下来就是将这些函数给写完
#include"stack.h"
void StackInit(Stack* ps)
{
assert(ps);
ps->a = NULL;
ps->top = ps->capacity = 0;
}
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if(ps->capacity==ps->top)
{
int newCapaciyt = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* place = (STDataType*)realloc(ps->a, newCapaciyt * sizeof(STDataType));
if(place==NULL)
{
perror("realloc fail");
return;
}
ps->a = place;
ps->capacity = newCapaciyt;
}
ps->a[ps->top] = data;
ps->top++;
}
void StackPop(Stack* ps)
{
assert(ps);
ps->a--;
}
STDataType StackTop(Stack* ps)
{
assert(ps);
return ps->a[ps->top - 1];
}
int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
bool StackEmpty(Stack* ps)
{
assert(ps);
return ps->top == 0;
}
void StackDestroy(Stack* ps)
{
assert(ps);
ps->capacity = ps->top = 0;
free(ps->a);
ps->a = NULL;
}
这样我们的栈及其它的基本功能就完成了 。