队列与栈
环形队列
环形队列中有队列头head和队列尾tail;
队空条件
head=tail (head所在位置=tail所在位置)
队内存储
tail的位置始终在存储内容的下一格
如果此时整个队伍全部存满,那么tail将会与head在同一位置,此种情况与队空条件完全一致无法判断是队空还是队满。
因上述原因统一规定,存储内容比实际内容少一格视为队满
队满判断条件
(tail+1)% size=head;
即队尾位置+1的结果再与队列的总位置数(size)取余,如果余数等于head所在位置则视为队满。
例如
上图中存储到6的位置此时tail在7的位置,此环形队列总共8个位置,根据公式
(7+1)% 8=0(8÷8取余=0) head在0的位置;此时head的位置与计算结果相等则说明队满。
注:head有时未必会在0的位置,此时公式仍然成立。
题目类型
已知队头位置,队内存储了几个数据,以及队列存储总个数,求队尾的位置。
队头位置0+存储数量3=队尾3
已知队头位置6是,队内存储了5个数据,队列存储总个数是8,求解队尾所在的位置
此时再用上述方法
队列头6+存储数据个数5=11;11已经超出了队列存储总数,此时需要除以队列存储总数取余进行修正:
队列头6+存储数据个数5=11;11%队列存储总数8取余=3才是队尾所在位置
上面例题中队头位置0+存储数量3=队尾3,也可以进行修正,3%11%队列存储总数8取余还是为3并不矛盾。
例题一
元素按照a,b,c顺序进栈,可能的出栈序列
全部进栈然后出来,出栈序列是c,b,a
逐个进栈出栈,得出栈序列a,b,c
a,b先进栈然后出栈,c再进栈出栈,得出栈序列b,a,c
综上,以某一种固定顺序入栈,可以得到的出栈顺序可能是多种。
例题二
题目中,经常自己设定队列出入队方式进行考察,根据不同题目要求灵活处理
进入队列的顺序是e1,e2,e3,e4
选项A:
e1,e2,e3,e4 从左端依次进入如下图
然后依次出队列可得序列:e4,e3,e2,e1 故选项A可得
选项B:
从左端进入e1,e2,从右端进入e3,再从左端进入e4如下图
然后依次出队列可得序列:e4,e2,e2,e3 故选项B可得
选项C:
从左端进入e1,从右端进入e2,再从左端进入e3,e4如下图
然后依次出队列可得序列:e4,e3,e1,e2 故选项C可得
选项D:无论从哪端进入都无法形成此序列,也无法得到此输出序列,故D选项不可得