栈/队列-受限的线性表
一.栈
1.概念
数据元素先进后出
只能在栈顶插入或删除
栈的插入和删除称为入栈和出栈
2.存储结构
(1)顺序栈
栈顶/栈尾“指针”可以是指针变量或整形变量
栈尾指针指向栈尾
初始为 ① NULL,指针 ② -1,整形
栈顶指针指向栈顶元素的下一个位置,初始指向栈尾
判空:
①top=base=NULL, 指针变量
②top=base= -1, 整形变量
选择题伪代码判空:S.top==0
(2)链栈(无头结点-红):
仅有栈顶指针
栈顶指针指向an,an再指向aₙ₋₁…
3.栈的应用
原理:栈有记忆当前状态的功能
应用:调用函数/递归/括号匹配/表达式求值
⇒递归算法空间复杂度一般为0(logn),如快速排序
二.队列
1.概念
数据元素先进先出
front:队头(删除元素)
rear:队尾(插入元素)
2.存储结构
2-1顺序-循环队列
(1)队头/队尾指针
①都是整形变量
②队头指针始终指向队列头元素
③队尾指针始终指向队尾元素的下一个位置,初始指向队头:front=rear=0(理论判空)
(2)判空:
rear=front(需要声明少用一个元素)
不然也有可能实际是队满而不是队空
(3)判满(默认少用一个空间,除非声明用tag):
队满:为队列分配的存储空间仅剩一个空间时
判断队满:(rear+1)%m=q.front
(4)元素个数:
(rear-fromt+m)%m
m为数组长度(非元素个数)
(5)插入,删除元素(默认少用一个空间)
①插入(在队尾):rear=(rear+1)%m
②删除(在队头):front=(front+1)%m
2-2链队列(头结点)
队头指针指向头结点,
队尾指针初始指向头结点
判空:front=rear
总结
1.指针
(1)顺序存储中可以是指针变量也可以是整形用来标识位置
①栈(栈顶元素):指针变量(课本)
②队列(队尾元素):整形,标识位置(通用)。因为循环队列不用整形会很麻烦
(2)链式存储都是指针变量
2.尾部指针(栈顶/队尾)
(1)顺序存储(非空):指向尾部元素下一个位置
①栈
栈顶指针初始指向栈尾top=base=Null(课本,指针变量)
top=base=-1(其他,整型变量)
②队列 队尾指针初始指向队头front=rear=0(理论判空)
(2)链式存储:指向当前元素位置(没法指向下一个位置)
①栈(不带头结点):仅有栈尾指针
②队列(带头结点):队尾指针初始指向头结点
3.考点
1:栈和队列本质上是操作受限的线性表