栈是一种特殊的线性表,它特殊在对线性表的操作进行了限制,只能在它的一端进行插入和删除,如下图所示:
遵循的是“先进后出”(first in last out)的规则,简称为”FILO”。
既然栈也是线性表,那么线性表的存储结构同样也适用于栈,通常有顺序栈和链式栈两种。
1.顺序栈的实现
头文件声明:
seqstack.h
#pragma once
#include<stddef.h>
typedef char SeqStackType;
typedef struct SeqStack
{
SeqStackType* data;
size_t size;
size_t capacity;//data这段内存中能容纳的元素个数
}SeqStack;
void SeqStackInit(SeqStack* stack);//初始化
void SeqStackDestroy(SeqStack* stack);//销毁
void SeqStackReSize(SeqStack* stack);//重新设置大小
void SeqStackPush(SeqStack* stack,SeqStackType value);//压栈
void SeqStackPop(SeqStack* stack);//出栈
//返回两个信息:执行成功失败,栈顶元素是多少
int SeqStackTop(SeqStack* stack,SeqStackType* value);//取栈顶元素,value输出型参数
具体实现及测试代码:
seqstack.c
#include"seqstack.h"
#include<stdio.h>
#include<stdlib.h>
void SeqStackInit(SeqStack* stack)
{
stack->size = 0;
stack->capacity = 1000;
stack->data = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));//开辟空间
}
void SeqStackDestroy(SeqStack* stack)
{
free(stack->data);//释放数据
stack->size = 0;//大小设为空
stack->capacity = 0;
}
void SeqStackReSize(SeqStack* stack)
{
if(stack->size < stack->capacity)//栈大小小于最大容量,不需要扩容,直接返回
{
return;
}
stack->capacity = stack->capacity*2+1;//扩容规则根据需求选择
SeqStackType* new_ptr = (SeqStackType*)malloc(stack->capacity * sizeof(SeqStackType));//重新开辟空间
int i = 0;
for( ;i < stack->size;i++)
{
new_ptr[i] = stack->data[i];//将以前栈的数据赋给新开辟的空间
}
free(stack->data);//释放以前的栈数据
stack->data = new_ptr;//更新指针