赞
踩
摘要:
1,队列的介绍
2,队列的数组实现
3,队列的链表实现
4,循环队列的介绍
1,队列的介绍
队列(queue)是一种先进先出(FIFO, First-In-First-Out)的数据结构,就像大家排队买票一样,先来的先买。队列只允许在后端(rear)插入,在前端(front)删除。
队列是一种非常简单的数据结构,在考试和面试中遇到的也比较多,队列的实现方式一般有两种方式,一种是通过数组实现,一种是通过链表实现。
2,队列的数组实现
使用数组实现队列需要先声明一个数组,然后使用两个变量rear和front分别指向队列的尾部和头部,rear实际指向的是尾部元素的下一个位置。
因为数组的长度在初始化的时候就已经确定,当队列中元素的个数等于数组长度的时候就不能再添加了,这个时候也可以考虑扩容,原理比较简单,我们直接看下代码。
Java 代码:
- public class Queue<E> {
- private final Object[] data; // 队列中存放元素的数组。
- private final int maxSize;// 队列的最大容量,超过最大容量可以考虑扩容。
- private int size; // 队列中元素的个数
- private int front = 0;// 队列的头,只能删除,指向队列的第一个元素
- private int rear = 0; // 队列的尾,只能添加,指向队列最后一个元素的下一个位置
-
- public Queue(int maxSize) {
- if (maxSize <= 0)
- throw new IllegalArgumentException("队列容量必须大于0 : " + maxSize);
- this.maxSize = maxSize;
- data = new Object[this.maxSize];
- }
-
- // 这地方可以扩容也可以抛异常,这里我们就不在扩容了,关于扩容,大家可以自己去实现
- public void add(E val) {
- if (isFull())
- throw new IllegalStateException("队列已经满了,无法再加入……");
- data[rear++] = val;// 添加元素。
- size++;
- }
-
- // 删除元素
- public E poll() {
- if (isEmpty())
- throw new IllegalStateException("队列是空的,无法删除……");
- E res = (E) data[front];
- data[front++] = null;
- size--;
- return res;
- }
-
- // 获取队列头部元素
- public E top() {
- if (isEmpty())
- throw new IllegalStateException("队列为空");
- return (E) data[front];
- }
-
- public boolean isEmpty() {// 队列是否为空
- return size == 0;
- }
-
- public boolean isFull() {// 队列是否满
- return rear == maxSize;
- }
-
- public int size() {// 队列中元素的个数
- return size;
- }
- }
C++代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。