目录
前言:
栈和队列都是一种特殊的线性表,在数据结构中,线性结构习惯称为线性表,线性表是最简单最常用的一种数据结构。所以我们在此先简单讲解一下线性结构和非线性结构。
一、线性结构和非线性结构的分辨
(1)线性结构
1.线性结构作为最常用的数据结构,其实就是有序数据元素的集合,常用的线性结构有:线性表,栈,队列,双队列,数字,串。
2.线性结构作为最常用的数据结构,其特点就是数据元素之间存在一对一之间的线性关系。
3.线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
(2)非线性结构
1.非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
2.常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图。(其中多维数组是由多个一维数组组成的,所以不再是线性结构)。
(3)误区警示
不管是线性结构还是非线性结构都可以采用链式存储和顺序存储结构;比如栈属于线性结构使用顺序结构存储,而循环队列也是线性结构却使用链式存储结构,而满二叉树和完全二叉树都是非线性存储结构,却都按层次进行顺序结构存储。
重点:链系存储结构比顺序存储结构插入和删除的效率更高。因为只需要更改所对应的结点指针即可,不需要发生数据移动。
二、简析栈和队列
1.栈
简单来说就是一种特殊的线性表,满足先进后出,后进先出原则;栈也有两种存储结构,链式和顺序结构。
下面重点讲一下这栈顶指针和栈底指针
通常用指针top来指示栈顶的位置,用指针bottom指示栈底的位置,栈顶指针top反应了栈不断变化的状态,栈的指针非常好理解,只有栈顶指针一直在运动,栈底指针bottom一直指向栈底,当入栈时,指针top 抬升,当出栈时,指针top下降。当top=botton时,为空栈。
2.队列
队列就比较特殊了,它的原则是先进先出,后进后出;我们可以借助下图进一步理解
队列有两个头,分别是允许删除运算的一端叫队头,和允许插入的一端叫队尾;
也就是说队列是从队尾开始插入元素,因为是按照排队顺序的方式进行入队,这使得当出队时第一个入队的自然就出队了。
循环队列:首先强调一点普通的队列是顺序存储,但也有特例,循环队列,循环队列是将队列的最后一个存储空间的位置绕道第一个位置,也可以这样理解rear指向front
当然不得不提的是,循环队列的初始状态是空,即front=rear=m;
但是在循环队列里,当front=rear是,不一定队列是满还是空,当s=0时,且front=rear=s;队列空,同理当s=1时,队列满。简单的分析一下为什么。
当入队时,rear是向后面位置移动的,简单来说就是,rear指针指向是一直向后的,而出队时,front的位置也是一直向后的,但当有一种特殊情况。
当rear=front=1时,这时候虽然rear=front,但其实他们之间是有一个元素的,也就是说此时队列只有一个元素,就是rear和front包裹的这个,理所当然此时,队列满;但如果rear=front=0;此时队列里的元素全部已经完成退队和入队操作,此时队列为空