朋友们, 本期的内容,我们终于开始新的章节了!
呼!!长出一口气!! 哈😊 毕竟链表开博已经很长一段时间了!!
下面让我们进入本期的正题 ---> 栈区
1.那什么是栈呢?
--->栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。
而进行数据插入与删除操作的一段称之为 栈顶 ,则另一端称之为 栈底。
类似人类一样,人类会遵循一定的“人学法则”;
而栈同样会遵循一种法则“后进先出”,其实这是它的原理构造而成的!!
为了方便理解与更加形象化,特推出一幅图示 ::>
2.那么栈该如何实现呢?
这里只介绍一种最常用,也是最优化的实现 ---->数组栈
下面开始上手代码了(老早就迫不及待了)
头文件 “Stack.h”
#include <stdio.h>
#include <stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int capcity;
int top;
}ST;
//初始化
void STInitial(ST* ps);
//销毁
void STDestroy(ST* ps);
//压栈
void STPush(ST* ps, STDataType x);
//出栈
void STPop(ST* ps);
//栈顶元素
STDataType STTop(ST* ps);
//布尔判空
bool STEmpty(ST* ps);
实现环节 “Stack.c”
#include "Stack.h"
//初始化
void STInitial(ST* ps)
{
ps ->a = (STDataType*)malloc(STDataType);
if(ps ->a == NULL)
{
perror("malloc::fail");
return ;
}
int capcity = 4;
int top = 0; //top = 0 是栈顶元素的下一个位置
//top = -1 是栈顶元素的位置
}
//销毁
void STDestroy(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
free(ps ->a);
ps ->a = NULL;
ps ->capcity = 0;
ps ->top = 0;
}
//压栈
void STPush(ST* ps, STDataType x)
{
if(ps ->capcity == ps ->top)
{
STDataType* tamp = (STDataType*)realloc(ps ->a, sizeof(STDataType) * ps ->capcity * 2);
if(tamp == NULL)
{
perror("realloc::fail");
return ;
}
ps ->a = tamp;
ps ->capcity *= 2;
}
// ps ->a[ps ->top] = x;
// ps ->top++;
ps ->a[ps ->top++] = x;
}
//出栈
void STPop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
ps ->top--;
}
//栈顶元素
STDataType STTop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps ->a[ps ->top - 1];
}
//布尔判空
bool STEmpty(ST* ps)
{
assert(ps);
return ps ->top == 0;
}
//栈区元素个数
void STSize(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps ->top;
}
测试环节 “Test.c”
#include "Stack.h"
int main()
{
ST st;
STInitial(&st);
STPush(&st, 12);
STPush(&st, 13);
STPush(&st, 16);
STPush(&st, 17);
STPush(&st, 18);
while(!STEmpty(&st))
{
printf("%d ", STTop(&st));
STop(&st);
}
printf("\n");
STDestroy(&st);
return 0;
}
还是为了方便观感,更好愉悦视觉!!特附上色彩代码 :
头文件 “Stack.h”
测试环节 “Test.c”
实现环节 “Stack.c”
为方便好友理解与掌控,有一个代码难点,需要说明下 ::>
这部分代码的难点在于 “ps ->a[ps ->top - 1]”
由于前部分 top = 0 代表着栈顶元素的下一个位置,因此入栈过程中,会从这个下一个位置进入!!也是说,栈顶位置不会有任何元素
如此 出栈顶元素的过程中,想要全部出栈区而且不能越界访问!!
那就必须严格控制住最后一个元素出栈区后,立即结束进程!!