数据结构学习之栈(C顺序表实现)
总纲
- 栈的声明
- 栈的初始化
- 栈的扩容
- 入栈
- 出栈
- 打印栈
- 获取栈顶元素
- 检查是否为空
- 栈的销毁
一. 栈的声明
由于存储的类型可以是任意的,所以用typedef将类型用一个变量表示
typedef int type;
typedef struct ArrStack
{
int size;
int capacity
type* arr;
int top; // 栈顶元素的索引
}Astack;
这里其实和顺序表很像了
二. 栈的初始化
首先想一想初始化后的栈是啥样子的
- size为0,因为没有元素
- capacity不为0,有一定的容量
- top为-1,表示此时栈中没有元素
不要忘记检查分配空间是否成功
void init(Astack* stack, int capa)// capa是初始化的栈的容量
{
stack->arr = (type*)realloc(capa, sizeof(type) * capa);
if (stack->arr != NULL)//检查空间是否分配成功
{
stack->size = 0;
stack->capacity = capa;
stack->top = -1;
}
else
{
printf("SpaceNotEnough");
return;
}
}
三. 栈的扩容
入栈之前要检查容量够不够
void ifenlarge(Astack* stack)
{
if (stack->size == stack->capacity - 1) // 表示入栈之前栈顶到容量最大值了
{
int new_capacity = stack->capacity * 2;
type* tmp = (type*)realloc(stack->arr, new_capacity * sizeof(type);
if (tmp != NULL) // 不要忘记检查空间是否分配成功
{
stack->arr = tmp;
stack->capacity = new_capacity;
}
else
{
printf("ReallocError");
return;
}
}
}
四. 入栈
入栈要尤其注意空间够不够
void Push(Astack* stack, type x) // x是要插入的元素
{
ifenlarge(stack);
stack->top++;
stack->arr[stack->top] = x;
stack->size++; // 长度要加一
}
五. 出栈
出栈要注意边界, 如果已经为空了就出不来了
不用表明元素和索引,直接从栈顶出去就行了
void Pop(Astack* stack)
{
stack->top--;
stack->size--;
}
这里注意不用将出栈的元素重置,反正再次入栈时还会修改
六. 打印栈
循环打印
void print(Astack* stack)
{
if (stack->size == 0) // 注意栈为空时打印不了捏
{
printf("no elements\n");
return;
}
for (int i = 0; i < stack->size; i++)
{
printf("%d ", stack->arr[i]);
}
}
七. 获取栈顶元素
因为top就是栈顶的索引,所以可以利用top直接获取
进行操作之前先判断有无元素
type Top(Astack* stack)
{
if (stack->top == -1)
{
return -1024; // 表示错误
}
return stack->arr[stack->top];
}
八. 检查是否为空
这个直接看top就行了
bool isempty(Astack* stack)
{
if (stack->top == -1)
{
return true; // true代表为空
}
return false;
}
其实也能看size,这个随便了
九. 栈的销毁
释放申请的空间并置空
void Destroy(Astack* stack)
{
free(stack->arr);
stack->arr = NULL;
stack->size = 0;
stack->capacity = 0;
stack->top = -1;
}