栈的类型声明以及函数声明:stack.h
#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
// 定义栈的元素类型 以整型为例
typedef int DataType;
// 定义栈的结构体 此处为顺序栈(内存为连续的)
typedef struct {
DataType *stack;
int top; // 栈顶指针,初始值为-1,表示栈为空
int maxSize; //最大容量
} Stack;
//创建栈
Stack* initStack(int maxSize);
// 判断栈是否为空
bool isStackEmpty(const Stack* stack);
// 判断栈是否已满
bool isStackFull(const Stack* stack);
// 入栈操作
void push(Stack* stack, DataType element);
// 出栈操作
void pop(Stack* stack);
// 获取栈顶元素
DataType peek(const Stack* stack);
// 销毁栈
void destroyStack(Stack* stack);
//获取栈的元素个数
int stackSize(const Stack* stack);
相关函数实现:stack.c
#include"stack.h"
//创建栈
Stack* initStack(int maxSize)
{
Stack* pstack = (Stack*)malloc(sizeof(Stack));
assert(pstack);
//申请数据内存
pstack->stack = (DataType*)malloc(maxSize * sizeof(DataType));
//初始化最大值
pstack->maxSize = maxSize;
//初始化栈顶序号
pstack->top = -1; //-1代表空栈
}
//获取栈中元素个数
int stackSize(const Stack* pstack)
{
//元素个数等于数组下标+1
return pstack->top + 1;
}
// 判断栈是否为空
bool isStackEmpty(Stack* pstack)
{
if (pstack->top == -1)
{
return true;
}
else
{
return false;
}
}
// 判断栈是否已满
bool isStackFull(Stack* pstack)
{
if (pstack->top+1== pstack->maxSize)
{
return true;
}
else
{
return false;
}
}
// 入栈操作:直接将元素放到栈顶位置即可
void push(Stack* pstack, DataType element)
{
//判断栈是否还存在
assert(pstack);
//判断栈是否满了
if (isStackFull(pstack))
{
printf("栈满\n");
return;
}
else
{
//先做++,再将元素进行放入
pstack->top++;
pstack->stack[pstack->top] = element;
}
}
// 出栈操作:数组的伪删除(不是真的删除数据,通过下标赋予修改权限)
void pop(Stack* pstack)
{
//判断栈是否还存在
assert(pstack);
if (isStackEmpty(pstack))
{
printf("空栈\n");
return;
}
else
{
pstack->top--;
}
}
// 获取栈顶元素
DataType peek(Stack* pstack)
{
//如果栈为空或者栈不存在,则报错
assert(pstack);
assert(!isStackEmpty(pstack));
return pstack->stack[pstack->top];
}
// 销毁栈
void destroyStack(Stack* pstack)
{
//注意先后顺序
free(pstack->stack);
free(pstack);
//在表外进行置空操作
//pstack=NULL;
}
栈是一个特殊的线性表,顺序栈和顺序表的写法大同小异,这里采用动态申请内存的方式创建栈,也可以用#define MAXSIZE和创建数组来实现栈的创建,两者没有本质区别,在内存中都是连续的。如有错误,请在评论区指正,谢谢!