队列的列听底层是数组,我们常说的说过实现队列其实就是顺序队列,其数据结构定义一般是美团面循:
为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,环队所以这里引入了队头和队尾两个指针,列听假设 front 指针指向队头元素,说过实现rear 指针指向队尾元素的美团面循下一个位置,这样:
示意图如下:
图片
众所周知,队列是先进先出的,那么进队操作对应的步骤就是:先送值到队尾,再将队尾指针 +1
// 送值到队尾queue[rear] = x;// 队尾指针 +1rear ++;
出队操作:先取出队头元素,再将队头指针 +1
// 取出队头元素x = queue[Q.front]// 队头指针 +1front ++;
顺序队列存在假溢出问题 ,就是明明在队列中仍然有可以存放元素的空间却无法执行入队操作了,举个例子:
队列的大小是 5(数组容量为 5),一开始是空队列,然后依次入队了 A、B、C、D:
图片
然后 A 出队,B 出队,相应的 front 指针会往后移动两位:
图片
再入队一个新元素 E,此时 front 指针不变,rear 指针需要 +1,已经超出了数组的下标范围,就会导致新元素插入失败:
图片
明明队列中还有空间,插入元素竟然会失败?这就是一种假性上溢出现象。
如何解决这个问题呢,有三种:
因此,循环队列是解决顺序队列假溢出问题的最佳选择!
循环队列的数据结构定义一般是:
具体实现步骤如下:
示意图如下:
图片
以下是一个基于数组实现循环队列的 Java 代码示例:
public class CircularQueue { // 存储元素的数组 private int[] data; private int front, rear; // 数组大小 private int capacity; public CircularQueue(int k) { capacity = k; data = new int[capacity]; front = 0; rear = 0; } // 入队 public boolean enqueue(int element) { if (isFull()) { return false; } else { data[rear] = element; rear = (rear + 1) % capacity; return true; } } // 出队 public boolean dequeue() { if (isEmpty()) { return false; } else { front = (front + 1) % capacity; return true; } } // 获取队头元素 public int front() { if (isEmpty()) { return -1; } else { return data[front]; } } // 获取队尾元素 public int rear() { if (isEmpty()) { return -1; } else { return data[(rear - 1 + capacity) % capacity]; } } // 判断队列是否为空 public boolean isEmpty() { return front == rear; } // 判断队列是否满 public boolean isFull() { return (rear + 1) % capacity == front; }}
简单总结就是:
(责任编辑:探索)
亚太卫星(01045.HK)年度纯利减少36.1% 每股盈利24.88港仙
中国金融投资管理(00605.HK)公布消息:将考虑向罗锐及关雪玲提起法律诉讼