数据结构之顺序栈与链式栈

1085 字
5 分钟
数据结构之顺序栈与链式栈

——————————————本文旨在交流计算机技术,欢迎指正————————————— 上一大章,我们深入讲解了链表的内容,这一章,我们详细介绍一种较为简单的数据结构———栈。 首先,我们介绍栈是什么:栈是一种单向的结构,其中栈的底部是固定的,不可以进出,我们可操作的部分只有栈顶,来进行出入栈操作。如图: 那么,这种结构的优越性在哪里呢?我们可知这种出站入栈的方式可以和好的追踪上一步的痕迹,所以在计算机应用中,我们常用的快捷键“ctrl+z”回溯键就是利用栈的原理实现的。同时,栈还是定义局部变量时操作系统为我们自动分配的一段有限空间。

下面,我们 来介绍顺序栈: 在书写顺序栈之前,我们先要了解四个概念:满栈递增,满栈递减,空栈递增,空栈递减。 下面附上代码:

//空栈递增
a1.data[a1.pos]=1;//先赋值
a1.pos++;//后移动pos位置
//每次完成一次后pos指向空的栈位置

空栈递增: ——————————————————————————————————————————

//满栈递增
pos++;//先更新pos指向位置
a1.data[a1.pos]=1;//再赋值
//每次完成后pos指向当前赋值的位置

满栈递增: ———————————————————————————————————————————

//空栈递减
a1.data[a1.pos]=e;//先赋值
pos--;//后更新位点
//只不过是从栈顶最大值开始,大往小递减,指向赋值下小的那一个空栈点

空栈递减: ———————————————————————————————————————————

//满栈递减
pos--;//先更新指向
a1.data[a1.pos]=e;//后更新栈值
//从栈顶大往小递减顺序,pos指向离栈底更近的一个空栈值

满栈递减: —————————————————————————————————————————————————————————————————————————————————————— 好了,现在我们已经介绍完顺序栈的基本结构和入栈方法了,下面,我们来完成一下这个数据结构吧! 1、首先是.h中的声明及(不懂的可以看我第一章讲的.h文件的作用):

typedef int Element;
#define MaxStackSize 5
typedef struct {
STACK_SIZE
int top;
} ArrayStack;
/* 递增空栈 */
void initArrayStack(ArrayStack *stack);
void pushArrayStack(ArrayStack *stack, Element e);
void popArrayStack(ArrayStack *stack);
Element getTopArrayStack(const ArrayStack *stack);
int isEmptyArrayStack(const ArrayStack *stack);
int isFullArrayStack(const ArrayStack *stack);

2、然后是初始化:

void initArrayStack(ArrayStack* stack) {
memset(stack->data, 0, sizeof(stack->data));
stack->top = 0;
}

3、增删改查操作(这里我们经常使用递增空栈来完成):

void pushArrayStack(ArrayStack* stack, Element e) {
stack->data[stack->top] = e;
++stack->top;
}
//增加函数
void popArrayStack(ArrayStack* stack) {
--stack->top;
}
//删除函数
Element getTopArrayStack(const ArrayStack* stack) {
int pos = stack->top - 1;
return stack->data[pos];
}
//查询函数
int isEmptyArrayStack(const ArrayStack* stack) {
return stack->top == 0;
}
//判断是否是空栈
int isFullArrayStack(const ArrayStack* stack) {
return stack->top == MaxStackSize;
}
//判断是否满栈

好了,我们已经讲解完成了顺序栈操作,接下来,我们来讲解链式栈的操作。类比表结构,既然有顺序表,我们就有链式表。与链式表原理,我们也有链式栈(同理,链式栈的逻辑结构也是旨在寻找零散空间插入,不再是顺序栈的那种整块空间但是实际空间分配还是依照操作系统来分配): 关于链式栈的构建,因为我们每次出栈的时候是找前一次的入栈并指向它,所以我们入栈的时候地址域指针指向前一个。 下面是一个概念图: 由此,模仿链式结构,我们可以实现链式栈: 1、头文件.h文件的编写:

typedef int Element;
#include "common.h"
typedef struct _node {
Element data;
struct _node *next;
} StackNode;//节点
typedef struct {
StackNode *top;
int count;
} LinkStack;//栈底
LinkStack *createLinkStack();
void releaseLinkStack(LinkStack *stack);
int pushLinkStack(LinkStack *stack, Element e);
int popLinkStack(LinkStack *stack, Element *e);

2、 实现增删改查

#include "linkStack.h"
#include
#include
//创建栈
LinkStack* createLinkStack() {
LinkStack* link_stack = malloc(sizeof(LinkStack));
if (link_stack == NULL) {
fprintf(stderr, "linkStack malloc failed!\n");
return NULL;
}
link_stack->top = NULL;
link_stack->count = 0;
return link_stack;
}
//销毁栈
void releaseLinkStack(LinkStack* stack) {
if (stack) {
while (stack->top) {
StackNode *tmp = stack->top;
stack->top = tmp->next;
free(tmp);
--stack->count;
}
printf("stack count: %d\n", stack->count);
}
}
//入栈
int pushLinkStack(LinkStack* stack, Element e) {
StackNode *node = malloc(sizeof(StackNode));
if (node == NULL) {
fprintf(stderr, "Stack Node malloc failed!\n");
return -1;
}
node->data = e;
node->next = stack->top;
stack->top = node;
++stack->count;
return 0;
}
//出栈
int popLinkStack(LinkStack* stack, Element* e) {
if (stack->top == NULL) {
fprintf(stderr, "stack empty!\n");
return -1;
}
*e = stack->top->data;
StackNode *tmp = stack->top;
stack->top = tmp->next;
free(tmp);
--stack->count;
return 0;
}

好了,我们已经讲解完毕顺序栈和链式栈,下面去练习一下吧~~~ ——————————————希望能对你有所帮助!——————————————————

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
数据结构之顺序栈与链式栈
https://firefly.cuteleaf.cn/posts/knowledge/数据结构之顺序栈与链式栈/
作者
Firefly
发布于
2026-06-21
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
数据结构顺序队列及链式队列
数据结构 ————————————本栏目旨在讨论计算机知识,欢迎交流————————————— 上一章,我们讨论了顺序栈和链式栈,这一章,我们将讲解线性结构的最后一个部分——顺序队列和链式队列。相比于栈结构的同端进出,就像原肠生物,而队列则是尾部入队和头部出队,就像后口生物一样。 如图: 那么,如何来实现入...
2
数据结构之树及树的存储
数据结构 ——————————————本栏目旨在交流计算机知识————————————————— 上一章节,我们介绍了线性的数据结构:表,栈,队列。接下来,我们将进入下一章节——树结构的学习。 首先,我们先介绍一下树的基本概念: 结点:使⽤树结构存储的每一个数据元素都被称为“结点”。例如图中的A就是一个结点。...
3
数据结构深度搜索与广度搜索的概念
数据结构 ————————————本文旨在交流计算机知识,欢迎指正!———————————— 上一章节我们系统介绍了树的存储结构与基本概念,这一章,我们将详细介绍一下——树的基本应用。首先,笔者会介绍树的基本遍历模式,其次,我会详细讲解深度优先搜索和广度优先搜索的概念。 首先,我们来介绍一下树的几种遍历形式:...
4
数据结构二叉树的基本介绍
数据结构 ————————————本文旨在讨论与学习计算机知识,欢迎交流———————————— 上一章,我们讲解了树结构的综述导论,那么,现在我们来深入了解一下树结构中最常用研究的结构——二叉树结构(上一章的扩展——孩子兄弟表示法就是利用的二叉树的原理)。 以上是关于普通二叉树的基本概念,我们可以结合上一...
5
顺序表的实现与介绍及部分工程思想的思考
数据结构 ——————————本文旨在讨论和探究计算机知识,欢迎指正———————————— 首先,我们来聊聊什么是线性表: 线性表,顾名思义,是一种具有线性结构的数据排布形式 ,是一个类似数组的东西,在逻辑上一个接一个有序的整块链接,区别于链表的无序分布链接。 如图,我们可以得出,顺序表是一条线一样的结构...
随机文章 随机推荐
Profile Image of the Author
Firefly
Hello, I'm Firefly.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
33
分类
7
标签
25
总字数
56,127
运行时长
0
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.12.3
文章许可
CC BY-NC-SA 4.0

文章目录