链栈:栈的链式存储结构
2012-08-03 00:00
1126 查看
前面讲完了栈的顺序存储结构,我们现在来看看栈的链式存储结构,简称为链栈。
链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
栈是用栈顶来做插入和删除操作,那么对于链栈的栈顶放在链表的头部还是尾部呢?
单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部。另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链找来说,是不需要头结点的。
所以链栈的结构是这样的:
对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间,如果真的发生,那此时的计算机操作系统已经面临死机崩溃的情况,而不是这个链栈是否溢出的问题。
但对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候。
与顺序栈有点区别,我们先看看以前单链表的结构体吧。
单链表的结构体定义:
链栈其实也是个链表,所以可以参考它的实现,栈的结点定义为:
以上是链栈的一个结点定义,但是我们还需要加入一个栈顶指针,所以完整的定义为:
这里怎么多声明了一个变量 count?用来干什么的吗?
记录栈中元素个数,也可以将元素个数属性放在LinkStack类型中定义。
结构体定义完毕之后,后面就可以通过编程来熟悉链栈的操作了。
栈的定义与大概理解
栈的抽象数据类型ADT
顺序栈:栈的顺序存储结构
顺序栈的进栈操作
顺序栈的出栈操作
获取顺序栈的栈顶元素
链栈:栈的链式存储结构
链栈的进栈操作
链栈的初始化与遍历
链栈的出栈操作
链栈的置空操作与判断链栈是否为空
为什么要使用栈这种数据结构
递归,栈的重要应用之一
栈是如何实现递归的
接触后缀表达式(逆波兰表示法)
图解后缀表达式的计算过程
将中缀表达式转化为后缀表达式
开始学习队列这个数据结构
队列的抽象数据类型ADT
顺序队列:队列的顺序存储结构
顺序队列的入队操作
顺序队列的出队操作
顺序队列置空与判断操作
队列顺序存储结构的不足
关于循环队列的一些讲解
链队列:队列的链式存储结构
链队列的初始化操作
链队列的入队操作
链队列的出队操作
补完链队列的其它常见操作
循环队列与链队列的优劣势
链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
栈是用栈顶来做插入和删除操作,那么对于链栈的栈顶放在链表的头部还是尾部呢?
单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部。另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链找来说,是不需要头结点的。
所以链栈的结构是这样的:
对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间,如果真的发生,那此时的计算机操作系统已经面临死机崩溃的情况,而不是这个链栈是否溢出的问题。
但对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候。
链栈的结构
对于栈来说,结构体定义需要定义两部分。一个是 top 指针,一个是存储数据。那么链栈又应该如何设计结构体呢?与顺序栈有点区别,我们先看看以前单链表的结构体吧。
单链表的结构体定义:
typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node *LinkList; /* 定义LinkList */
链栈其实也是个链表,所以可以参考它的实现,栈的结点定义为:
/* 链栈结构 */ typedef struct StackNode { SElemType data; struct StackNode *next; } StackNode,*LinkStackPtr;
以上是链栈的一个结点定义,但是我们还需要加入一个栈顶指针,所以完整的定义为:
typedef int Status;
/* SElemType类型根据实际情况而定,这里假设为int */
typedef int SElemType;/* 链栈结构 */ typedef struct StackNode { SElemType data; struct StackNode *next; } StackNode,*LinkStackPtr;typedef struct
{
LinkStackPtr top;
int count;
} LinkStack;
这里怎么多声明了一个变量 count?用来干什么的吗?
记录栈中元素个数,也可以将元素个数属性放在LinkStack类型中定义。
结构体定义完毕之后,后面就可以通过编程来熟悉链栈的操作了。
延伸阅读
此文章所在专题列表如下:栈的定义与大概理解
栈的抽象数据类型ADT
顺序栈:栈的顺序存储结构
顺序栈的进栈操作
顺序栈的出栈操作
获取顺序栈的栈顶元素
链栈:栈的链式存储结构
链栈的进栈操作
链栈的初始化与遍历
链栈的出栈操作
链栈的置空操作与判断链栈是否为空
为什么要使用栈这种数据结构
递归,栈的重要应用之一
栈是如何实现递归的
接触后缀表达式(逆波兰表示法)
图解后缀表达式的计算过程
将中缀表达式转化为后缀表达式
开始学习队列这个数据结构
队列的抽象数据类型ADT
顺序队列:队列的顺序存储结构
顺序队列的入队操作
顺序队列的出队操作
顺序队列置空与判断操作
队列顺序存储结构的不足
关于循环队列的一些讲解
链队列:队列的链式存储结构
链队列的初始化操作
链队列的入队操作
链队列的出队操作
补完链队列的其它常见操作
循环队列与链队列的优劣势
相关文章推荐
- 2008秋-链栈-链式存储结构的栈
- 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)
- 链栈:栈的链式存储结构
- 顺序栈、链栈基本操作
- 栈的链式存储结构与操作
- 链栈(link stack)
- 链栈的实现
- 链式存储结构的线性表
- 数据结构基础系列——链栈的实现
- 顺序存储结构与链式存储结构的比较(也可以说的顺序表与链表的比较)
- 栈的基本操作(链栈)
- 数据结构顺序栈和链栈基本操作----c++实现
- 二叉树的链式存储结构
- 链栈的实现
- ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
- 数据结构-线性表-链式存储结构完整可执行代码
- <数据结构>链栈的C语言实现
- 链栈
- 链栈的实现LinkStack
- 判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)