和栈一样,队列也是线性的集合。对于队列来说,插入限制在一端,也就是队尾,删除限制在另一端,也就是对头。队列支持先进先出的协议。
本文使用java中的数据和列表来实现队列类,从而更加详细和直观的理解队列的使用和性质。
1、使用数组实现队列
public class QueueWithArray {
private int [] queueArray;
private int front = 0;
private int rear = 0;
public QueueWithArray() {
this(5);
}
public QueueWithArray(int queueSize) {
queueArray = new int [queueSize];
}
public void push(int element) {
if (rear >= front && rear < queueArray.length - 1) {
queueArray [rear ++] = element;
}
else if(rear == queueArray.length - 1 && front == 0) {
int [] tempArray = new int [queueArray.length * 2];
System.arraycopy(queueArray, 0, tempArray, 0, queueArray.length);
queueArray [rear ++] = element;
}
else if (front > 0 && rear == queueArray.length - 1) {
queueArray [rear] = element;
rear = 0;
}
else if (rear < front - 1)
queueArray [rear ++ ] = element;
else if (rear < front && rear == front - 1) {
loopArrayCopy();
queueArray [rear ++] = element;
}
}
public int pop() {
if (front == queueArray.length - 1) {
int reasult = queueArray [front];
front = 0;
return reasult;
}
else if (front == rear - 1) {
int reasult = queueArray [front];
front = 0;
rear = 0;
return reasult;
}
else
return queueArray [front ++];
}
public int peek() {
return queueArray [front];
}
public boolean isEmpty() {
return front == 0 && rear == 0;
}
public int getSize() {
if (front < rear)
return rear - front;
else if (front > rear) {
int frontNumber = queueArray.length - front;
int rearNumber = rear;
return frontNumber + rearNumber;
}
else
return 0;
}
private void loopArrayCopy() {
int [] tempArray = new int [queueArray.length * 2];
System.arraycopy(queueArray, front, tempArray, 0, queueArray.length - front);
System.arraycopy(queueArray, 0, tempArray, queueArray.length - front, rear);
front = 0;
rear = queueArray.length - 1;
queueArray = tempArray;
}
public void clear() {
rear = 0;
front = 0;
}
@Override
public String toString() {
String s = " ";
if (front < rear) {
for (int index = front; index < rear; index ++)
s += (Integer.toString(queueArray [index]) + " ");
return s;
}
else if (front > rear) {
for (int index = front; index < queueArray.length; index ++)
s += (Integer.toString(queueArray [index]) + " ");
for (int index = 0; index < rear; index ++)
s += (Integer.toString(queueArray [index]) + " ");
return s;
}
else
return "The queue is empty";
}
}
为了验证类的正确性下面提供验证程序
public class TestQueueWithArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
QueueWithArray queue = new QueueWithArray(4);
queue.push(1);
queue.push(2);
int a = queue.pop();
System.out.println(a);
System.out.println(queue.toString());
queue.push(3);
queue.push(4);
queue.push(5);
System.out.println(queue.getSize());
queue.push(6);
System.out.println(queue.getSize());
System.out.println(queue.toString());
queue.clear();
System.out.println(queue.isEmpty());
}
}
2、使用列表实现队列
import java.util.ArrayList;
public class QueueWithList {
private ArrayList<Integer> queueList= new ArrayList<>();
public QueueWithList() {
}
public void add(int number) {
queueList.add(number);
}
public int pop() {
int number = queueList.remove(0);
return number;
}
public int peek() {
return queueList.get(0);
}
public boolean isEmpty() {
return queueList.isEmpty();
}
public int len() {
return queueList.size();
}
public void clear() {
queueList.clear();
}
@Override
public String toString() {
String s = "";
for (int index = 0; index < queueList.size(); index ++ ) {
if (index < queueList.size() - 1)
s += (Integer.toString(queueList.get(index)) + " ");
else
s += Integer.toString(queueList.get(index));
}
return s;
}
}
测试程序:
public class TestQueue {
public static void main(String[] args) {
// TODO Auto-generated method stub
QueueWithList queue = new QueueWithList();
queue.add(1);
queue.add(2);
System.out.println(queue.toString());
int a = queue.peek();
System.out.println(a);
System.out.println(queue.toString());
System.out.println(queue.len());
queue.clear();
System.out.println(queue.isEmpty());
}
}