目录
1.栈的定义
栈是一种只允许在一端进行操作(插入和删除)的线性表。
栈是严格遵守后进先出的一种数据结构,简称LIFO结构。
2.栈的分类
由于栈是一个只允许在一端进行操作的线性表,因此我们可以使用单链表或者线性表(数组)来实现一个栈。
3.栈的功能
栈的功能,无非是对数据进行增删查改的操作。
我们在此篇文章中实现以下几个功能。
1.栈的初始化
2.判断栈是否为空
3.返回栈顶元素
4.返回栈的数据个数
5.入栈
6.出栈
7.打印栈元素
8.销毁栈
4.栈的声明
顺序栈即用数组完成一个栈
因此我们需要在声明一个数组。
而数组不是无限长的,因此我们需要声明一个变量表示数组的容量
由于我们只能从栈顶出数据,因此我们需要声明一个变量表示栈顶的位置
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; //栈顶
int capacity; //容量
}Stack;
5.栈的功能的具体实现
5.1栈的初始化
首先我们应该断言一下看看传来的指针是不是有效的。
然后我们就可以初始化我们的栈了
首先,我们应该给数组开一个空间,这里我们动态申请四个空间。
然后我们就需要更新栈顶和容量。
这里的容量可以定义为0也可以定义为我们申请的空间值,这里是无所谓的。
void StackInit(Stack* st)
{
assert(st);
st->a = (STDataType*)malloc(4 * sizeof(STDataType));
if (!(st->a))
{
perror("malloc fail!");
exit(1);
}
st->capacity = 0;
st->top = 0;
}
5.2判断栈是否为空
判断一个栈是否为空,就是判断栈顶元素的位置。
如果栈顶元素top的位置还是0,那么这个栈就是空的。
bool StackEmpty(Stack* st)
{
assert(st);
return (st->top == 0);
}
5.3返回栈顶元素
返回栈顶元素就是返回top位置元素的值,因此我们返回数组中对应的值即可。
但是这里要注意,我们返回数组是返回数组的下标,由此我们应该如此写代码:
STDataType StackTop(Stack* st)
{
assert(st);
return (st->a[st->top - 1]);
}
5.4返回栈的数据个数
返回栈的数据个数,就是看看栈里面已有了多少个数据。
而我们的top恰好就是数据的个数,因此我们返回top即可。
int StackSize(Stack* st)
{
return st->top;
}
5.5入栈
由于我们每次入栈都需要判断一下空间够不够,因此我们在初始化的时候,capacity初始化为0或初始化为4是无所谓的。
入栈前首先要判断一下空间还够不够用,这个我们可以单独当作一个函数写出来也可以写到入栈函数中。
入栈时,我们需要进行的操作是让栈顶元素+1,并将下标为top位置处的数组元素置为指定值。
//判断空间
void STCheckCapacity(Stack* st)
{
//已满
if (st->top == st->capacity)
{
int newcapacity = st->capacity == 0 ? 4 : 2 * (st->capacity);
STDataType* tmp = (STDataType*)realloc(st->a, newcapacity * sizeof(newcapacity));
if (!tmp)
{
perror("realloc fail!");
exit(1);
}
st->a = tmp;
st->capacity = newcapacity;
}
}
//入栈
void StackPush(Stack* st, STDataType x)
{
assert(st);
STCheckCapacity(st);
st->a[st->top] = x;
st->top++;
}
5.6出栈
出栈就是将栈顶元素(弹出)删掉,根据我们之前在单链表学习的知识,这里直接让top--即可。
void StackPop(Stack* st)
{
assert(st);
assert(!StackEmpty);
st->top--;
}
5.7打印栈元素
void StackPrint(Stack* st)
{
assert(st);
for (int i = 0; i < st->top; i++)
{
printf("%d\n", st->a[i]);
}
}
5.8销毁栈
动态申请的空间释放掉之后需要记得置空,不然就要寄掉了
void StackDestroy(Stack* st)
{
assert(st);
free(st->a);
st->a = NULL;
st->capacity = 0;
}
6.头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; //栈顶指针
int capacity; //容量
}Stack;
void STCheckCapacity(Stack* st);//判断空间
void StackInit(Stack* st);//初始化栈
bool StackEmpty(Stack* st);//判断栈是否为空
STDataType StackTop(Stack* st);//返回栈顶元素
int StackSize(Stack* st);//栈的大小
void StackPush(Stack* st, STDataType x);//入栈
void StackPop(Stack* st);//出栈
void StackPrint(Stack* st);//打印
void StackDestroy(Stack* st);//销毁栈