什么是数组栈
栈是一种特殊的线性表,必须满足"LIFO"(last in fast out),也就是后进先出的原则, 类似于手枪弹夹,只能在栈顶添加或删除数据,向栈顶添加数据叫做压栈(Push),从栈顶删除数据叫出栈(Pop),除此之外,栈还应该能够读取栈顶的数据,获取栈的大小,以及判断栈体是否为空。
C语言能实现数组栈和链式栈,
其中用C语言中结构体和数组模拟实现,能完成栈的各种操作的栈结构,就称为 数组栈。
具体实现:
1.定义结构体Stack来模拟栈体:
typedef int StackDataType;
typedef struct Stack {
StackDataType* arr;
size_t top;
size_t capacity;
}Stack;
结构体中:
arr :用来存数据;
top:用来表示栈顶;
capacity:数组大小;
2.栈操作函数的声明:
#include<stdio.h>//预处理
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
#define InitCapacity 2//设置初始栈容量
void StackInit(Stack* ps);//初始化
void StackDestory(Stack* ps);//销毁
void StackPush(Stack* ps, StackDataType x);//压栈
void StackPop(Stack* ps);//出栈
bool StackEmpty(Stack* ps);//判断是否为空栈
StackDataType StackTop(Stack* ps);//访问栈顶元素
size_t StackSize(Stack* ps);//获取栈的大小
3.栈操作函数的定义 :
初始化:
void StackInit(Stack* ps)
{
assert(InitCapacity);
assert(ps);
ps->arr = (StackDataType*)malloc(InitCapacity * sizeof(StackDataType));
ps->top = 0;
ps->capacity = InitCapacity;
}
为数组开辟空间,初始化结构体的各项值。
销毁(Deatory):
void StackDestory(Stack* ps)
{
assert(ps);
free(ps->arr);
}
销毁栈,释放内存。
压栈(Push):
void StackPush(Stack* ps, StackDataType x)
{
assert(ps);
if (ps->top == ps->capacity) {//判断是否需要扩容
StackDataType* ret;
assert(ret = (StackDataType*)realloc(ps->arr, (unsigned int)2 * ps->capacity * sizeof(StackDataType)));
ps->arr = ret;
ps->capacity *= 2;
}
ps->arr[ps->top++] = x;//从栈顶压入指定元素
}
先判断数组容量看是否需要扩容,再将元素从栈顶压入。
出栈(Pop):
void StackPop(Stack* ps)
{
assert(ps);
if (ps->top) {
ps->top--;
}
}
栈顶下移一位,视为弹出了原栈顶位置的元素。
判断是否为空栈:
bool StackEmpty(Stack* ps)
{
assert(ps);
return ps->top==0;
}
判断是否为空栈,返回布尔类型值。
访问栈顶元素:
StackDataType StackTop(Stack* ps)
{
assert(ps);
assert(ps->top);
return ps->arr[ps->top-1];
}
返回栈顶元素的值。
获取栈的大小:
size_t StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
返回栈中的元素个数。