一、基础知识
1、队列有一片连续的存储区,可以存放数组或者链表。
2、队列有head头指针,tail尾指针(通常指向最后一个元素的下一位,因为大多数编程语言中,描述区间范围通常都是左闭右开”[ )“,这样的好处是,tail - head就是元素数量 。
3、普通队列,只支持头部出队与尾部入队操作(这是逻辑层面上的操作,移动对应的head、tail指针),不是删除存储区中的空间。
head tail
1 | 2 | 3 | 4 |
上面队列中,head指向头元素1,对应的下标是0 ;tail指向尾元素4的下一位,对应的下标是4;当tail - head等于4,刚好就是元素数量
head tail
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
上面队列,进行 两次出队后,头指针head指向元素3,这只是逻辑上head移动,在存储区中还是存在元素1和2,但无法访问前面的元素。同时添加5、6、7、8四个元素,尾指针tail往后移动4次,它已经无法添加新元素9了,因为tail指向存储区的末尾。队列空间有8个,但队列实际存储可用只有6个,前面2个空间没用上,这是真的溢出吗?明显这只是tail尾指针逻辑上移到最后一位,才判断时误以为满了,这就是所谓的假溢出。
4、为了解决假溢出,提出一个新队列--循环队列。就是tail尾指针指向最后一位时,重新将tail指针指向队列第一位,只是为了有效利用队列空间。
tail head
9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
原文:https://www.cnblogs.com/xuanxing1988/p/14864939.html