文章目录
一、什么是栈
栈(stack),一种运算受限的线性表。仅能够在表尾进行插入和删除操作的线性表。
这一端被称为栈顶(top),相对地,把另一端称为栈底(bottom)。
向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
二、栈的数据结构特征
(1)限定只能在栈顶进行插入和删除操作。
(2)栈中的数据元素遵守 先进后出(First In First Out) 的原则,简称FILO结构。
栈的结构体
// 栈结构体
typedef struct stack
{
int top;
int maxSize;
ElemType* element;
}Stack;
三、各个功能实现
(一)初始化
1、算法步骤
(1)创建一个能容纳
m
a
x
S
i
z
e
maxSize
maxSize 个单元的空栈
(2)为栈元素数组申请动态空间
(3)由于是空栈,栈顶指针指向
−
1
-1
−1
2、算法代码
// 初始化一个最大容量为 maxSize 的空栈
void Create(Stack* stack, int maxSize)
{
stack->maxSize = maxSize;
stack->element = (ElemType*)malloc(maxSize * sizeof(ElemType));
stack->top = -1; // 空栈
}
(二)清空栈内元素(不释放存储空间)
1、算法步骤
(1)栈顶指针指向 − 1 -1 −1
2、算法代码
// 清空一个栈,但不释放存储空间
void Clear(Stack* stack)
{
stack->top = -1;
}
(三)销毁一个栈(释放存储空间)
1、算法步骤
(1)栈的最大存储空间置 0, 即
m
a
x
S
i
z
e
=
0
maxSize = 0
maxSize=0
(2)释放栈的存储空间
(3)栈顶指针 指向
−
1
-1
−1
2、算法代码
// 清空一个栈,并释放存储空间
void Destory(Stack* stack)
{
stack->maxSize = 0;
free(stack->element);
stack->top = -1;
}
(四)判断是否空栈
1、算法步骤
(1)如果栈顶指针指向 − 1 -1 −1,返回 t r u e true true,否则返回 f a l s e false false
2、算法代码
// 判断栈是否为空
int IsEmpty(Stack* stack)
{
return stack->top == -1;
}
(五)判断是否满栈
1、算法步骤
(1)如果栈顶指针指向 m a x S i z e − 1 maxSize-1 maxSize−1,返回 t r u e true true,否则返回 f a l s e false false
2、算法代码
int IsFull(Stack* stack)
{
return stack->top == stack->maxSize - 1;
}
(六)获取栈顶元素
1、算法步骤
(1)判断是否栈空
(返回栈顶元素)
2、算法代码
// 返回栈顶元素
ElemType Top(Stack* stack)
{
if (IsEmpty(stack))
{
return Error;
}
return stack->element[stack->top];
}
(七)入栈Push操作
1、算法步骤
(1)先判断是否栈满
(2)栈顶指针++
(3)栈顶指针指向的空间赋值为 x
2、算法代码
void Push(Stack* stack, ElemType x)
{
if (IsFull(stack))
{
return Error;
}
stack->top++;
stack->element[stack->top] = x;
}
(八)出栈Pop操作
1、算法步骤
(1)判断是否栈空
(2)栈顶指针–
2、算法代码
void Pop(Stack* stack)
{
if (IsEmpty(stack))
{
return Error;
}
stack->top--;
}
(九)打印栈的元素结构
1、算法步骤
(1)从栈顶依次输出元素
2、算法代码
// 打印栈的结构
void PrintStack(Stack* stack)
{
int top = stack->top;
while (top >= 0)
{
printf("%d\n", stack->element[top]);
top--;
}
}
四、全部代码
#include <stdio.h>
#define ElemType int
#define Error 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotPresent 4
#define Duplicate 5
typedef int Status;
// 栈结构体
typedef struct stack
{
int top;
int maxSize;
ElemType* element;
}Stack;
// 初始化一个最大容量为 maxSize 的空栈
void Create(Stack* stack, int maxSize)
{
stack->maxSize = maxSize;
stack->element = (ElemType*)malloc(maxSize * sizeof(ElemType));
stack->top = -1; // 空栈
}
// 清空一个栈,但不释放存储空间
void Clear(Stack* stack)
{
stack->top = -1;
}
// 清空一个栈,并释放存储空间
void Destory(Stack* stack)
{
stack->maxSize = 0;
free(stack->element);
stack->top = -1;
}
// 判断栈是否为空
int IsEmpty(Stack* stack)
{
return stack->top == -1;
}
int IsFull(Stack* stack)
{
return stack->top == stack->maxSize - 1;
}
// 返回栈顶元素
ElemType Top(Stack* stack)
{
if (IsEmpty(stack))
{
return Error;
}
return stack->element[stack->top];
}
void Push(Stack* stack, ElemType x)
{
if (IsFull(stack))
{
return Error;
}
stack->top++;
stack->element[stack->top] = x;
}
void Pop(Stack* stack)
{
if (IsEmpty(stack))
{
return Error;
}
stack->top--;
}
// 打印栈的结构
void PrintStack(Stack* stack)
{
int top = stack->top;
while (top >= 0)
{
printf("%d\n", stack->element[top]);
top--;
}
}
int main()
{
Stack* stack = malloc(sizeof(Stack));
Create(stack, 10);
Push(stack, 0);
Push(stack, 1);
Push(stack, 2);
Push(stack, 3);
PrintStack(stack);
}