这两种结构也是线性关系的特殊的两种使用结构场景;
栈的特点就是,先进后出,或者说后进先出;
队列的特点就是,先进先出;
1.使用场景:
生活中例如排队呀,一般先进先出,类似的概念;
其次,例如磁盘缓冲区、操作系统的作业调度一般也是队列实现的,等;
2.例如:
a,b,c依次入队列,后续出也是a.b.c;
一般插入的存储入口叫做队尾,rear;
一般删除、查询的存储出口叫做对头,front;
3.队列的顺序存储结构:循环队列
本质上还是顺序表的实现,连续的存储单元,
单队列,一般插入存储单元时,直接新增,o(1),
但是出队列时,时间复杂度就是o(n)了,需要保证剩下的n-1个存储单元,数组下标还是从0开始,就要依次循环移动存储单元了,
所以用了循环队列,front和rear动态变化,不移动存储单元位置了,更改队列的记录值队头和队尾(数组的下标值),front和rear;
例如:a,b,c
依次入队列后,队尾a,rear = 0,队头front = 2,a出队列后,rear = 1,front不变,还是2;
插入、删除、查询操作,时间复杂度都是o(1);
空,front = rear;
队列慢,(rear+1)% size = front;
3.1队列的初始化
new一个空队列,front = rear=size -1;
3,2入队列操作
如果rear+1)% size = front,队列满,否则
入栈就是,数组下一个存储单元存储值即可,
rear = (rear+1)%size;
data[rear] = 入队列值;
3.3出队列操作
如果tfront = rear,空队列,抛出异常;
否则,只需取出栈定元素,
front= (front+1)%size;
return data[front];
4.队列的链式存储-链队列
链队列是以单链表的形式存在,进行插入、删除、查询,时间复杂度o(1)
空队列,front = rear=null;
4.1构造空队列
调用初始化方法即可,
创建空链节点a,a.next = null;front = rear = a;
4.2入队列
初始化一个节点a;复制当前新增内容以及next,
其次,rear.next = a,rear = a;
这就完成了在队尾后面新增一个节点
4.3出队列
如果front = rear.则是空队列
否则,暂存当前对头节点a;临时变量b存储当前节点值;
摘除出队列节点
front。next = a.next;
delete当前节点a,之后返回出栈值 b
总之,顺序队列和来链队列,时间复杂度都是o(1),
队列和栈的性能类似,只是循环队列不能像顺序栈那样共享空间,一个数组中不能存放两个循环队列