大家好呀,今天我们来学习一下栈,并且完成栈的实现。
栈是一种特殊性的线性表,他只允许在固定的一端进行插入和删除元素操作。其中进行数据插入和删除的一端称为栈顶,另一端为栈底。栈中的数据元素遵行先入后出LIFO(Last In First Out)原则。
过程如下:
栈可以使用数组或者链表实现,相对而言,数组的结构实现会更优。因为数组的尾插代价较小。
了解了上述的内容之后,我们来实现栈。
首先我们创建一个工程,组成为:源文件:Stack.c和Test.c,头文件:Stack.h。
Stack.h:声明函数和应用库函数
Stack.c:存放函数内容
Test.c:调试内容
接下来我们来构建栈的结构体,我们的栈需要一个指针指向我们的数据,设定一个整型:top代表我们的栈顶数据。设定一个整型:capacity来记录我们当前的最大容量。
接下来我们需要完成几个基本功能函数:栈的初始化(StackInit),入栈(StackPush),出栈(StackPop), 栈的销毁(StackDestory)。
按照顺序我们一起来逐一实现:
栈的初始化(StackInit):初始化中,我们需要将我们的数据指针指向NULL,将我们的top(与当前栈中的个数相当)和capacity设置为0。
入栈(StackPush):我们在入栈时需要先判断我们容量是否充足,所以我们将top和capacity进行比较(我们的a是一个数组指针,top是栈顶的下标)。如果我们的top==capacity,那么我们需要进行扩容操作。
判断容量是否充足之后我们就进行入栈操作:我们将栈顶的元素设置为新的数据,然后将我们的top++。
出栈(StackPop):我们只需要将top--,这样后续的插入会将其覆盖。
栈的销毁(StackDestory):我们将a指针指向的区域释放,然后置空即可,然后将top和capacity 重新设置为0。
完成上述基本功能函数之后,我们也就完成了一个栈的构建。接下来我们来补充几个功能函数: 获取栈顶元素 (StackTop),获取栈中的有效元素个数(StackSize),检查栈是否为空,如果为空返回非零结果,如果不为空返回0 (StackEmpty)。
获取栈顶元素 (StackTop):我们直接返回我们的top-1元素即可。
获取栈中的有效元素个数(StackSize):我们的top就是我们当前栈中的元素个数,所以返回top即可。
检查栈是否为空,如果为空返回非零结果,如果不为空返回0 (StackEmpty):我们根据top判断是否为0。
本期栈内容到此我们就完成啦,希望各位能有所收获。欢迎各位大佬指点,纠正错误。代码如下:
//Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SDataType;
typedef struct Stack
{
SDataType* a;
int top;
int capacity;
}Stack;
//栈初始化
void StackInit(Stack* ps);
//入栈
void StackPush(Stack* ps, SDataType x);
//出栈
void StackPop(Stack* ps);
//栈的销毁
void StackDestory(Stack* ps);
// 获取栈顶元素
SDataType StackTop(Stack* ps);
//获取栈中的有效元素个数
int StackSize(Stack* ps);
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
//Stack.c
#define _CRT_SECURE_NO_WARNINGS
#include"Stack.h"
//栈初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
//入栈
void StackPush(Stack* ps, SDataType x)
{
assert(ps);
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SDataType* tmp = (SDataType*)realloc(ps -> a, sizeof(SDataType)*newcapacity);
if (tmp == NULL)
{
perror("realloc tmp");
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
//出栈
void StackPop(Stack* ps)
{
ps->top--;
}
//栈的销毁
void StackDestory(Stack* ps)
{
free(ps->a);
ps->a = NULL;
ps->top = 0;
ps->capacity = 0;
}
// 获取栈顶元素
SDataType StackTop(Stack* ps)
{
return ps->a[ps->top - 1];
}
//获取栈中的有效元素个数
int StackSize(Stack* ps)
{
return(int)ps->top;
}
//检查栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{
if (ps->top == 0)
{
return -1;
}
return 0;
}