一、队列定义
队列:先进者先出
二、队列的操作
入队:enQueue
出队:deQueue
三、队列的实现
队列可以用数组来实现,也可以用链表来实现。用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈。同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。
四、相关代码
public class QueueTest {
private int head; //头指针
private int tail; //尾指针
private String[] items; //存放队列数组
private int size; //初始化队列大小
public QueueTest(int capacity){
items = new String[capacity];
this.size = capacity;
this.head=0;
this.tail =0;
}
public boolean enQueue(String data){
if(this.tail == this.size ){
//队列已满
if(this.head ==0){
return false;
}else{
//队列未满,出栈导致前面内容出现空闲,重新复制迁移
for(int n =this.head;n<this.tail;n++){
items[n-this.head] = items[n];
}
//重新设置头指针、尾指针
this.tail -= this.head;
this.head = 0;
}
}
//在队列后面添加元素
items[this.tail] = data;
this.tail ++;
return true;
}
public String deQueue(){
//头指针和尾指针相等,队列为空
if(this.head == this.tail ){
return null;
}
String ret =items[head];
this.head ++;
return ret;
}
//队列打印
public void print(){
if(this.head == this.tail){
System.out.println("队列为空");
}else{
int ret =this.head;
while(this.head !=this.tail){
System.out.print(items[this.head]+",");
this.head ++;
}
//恢复原有的指针
this.head = ret;
}
}
public static void main(String args[]){
QueueTest queueTest = new QueueTest(5);
System.out.println(queueTest.tail);
queueTest.enQueue("a");
queueTest.enQueue("b");
queueTest.enQueue("c");
queueTest.print();
System.out.println(queueTest.tail);
queueTest.enQueue("d");
queueTest.enQueue("e");
//System.out.println(queueTest.head+","+queueTest.tail);
System.out.println("新的打印");
queueTest.print();
System.out.println("队列第一个元素为:"+queueTest.deQueue());
System.out.println("队列第一个元素为:"+queueTest.deQueue());
System.out.println("出栈后,新的队列为:"+queueTest.head+","+queueTest.tail);
queueTest.print();
queueTest.enQueue("1");
queueTest.enQueue("2");
System.out.println("增加后,新的队列为:");
queueTest.print();
}
}
五、注意事项
队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾,原因:随着不停地进行入队、出队操作,head 和 tail 都会持续往后移动。当 tail 移动到最右边,即使数组中还有空闲空间,也无法继续往队列中添加数据了,这种需要进行数据搬移,每次进行出队操作都相当于删除数组下标为 0 的数据,要搬移整个队列中的数据,这样出队操作的时间复杂度就会从原来的 O(1) 变为 O(n),优化方案是:如果没有空闲空间了,在入队时,集中触发一次数据的搬移操作即可