实现了栈后,索性又实现以下队列。本文主要介绍队列的定义、队列的java实现和队列的作用。
队列的定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表,特点是“先进先出,后进后出”。
队列的实现
这里说一下,我这实现的和队列的定义其实不符合,只是遵从了先进先出的思想。为了防止出现“假溢出”的问题,每次删除元素都添加了一个动作:将所有元素前移一位,这样对头始终在数组的开始。基本思想和栈的实现一样,用一个字符串数组作为队列的容器,数组的第一个元素为队列头部,并用一个int值作为队列的尾部指针。当插入队列的时候,直接将值放入数组的相应位置; 删除队列元素的时候,用到System.arraycopy()这个方法将除了队列头部的数据向前移动一位。注意这个过程中的队列尾部指针的变化。
/**
*基于String数组的队列,数组第一个为队头,插**入的字符依次加入数组
*/
public class Queue{
/*
*队列容器数组
*/
private String[] queueStr;
/*
*队尾指针
*/
private int rear;
/*
*队列容器数组的长度
*/
private int length = 0;
public Queue(){
this.rear = -1;
this.length = 100;
queueStr = new String[length];
}
public Queue(int length){
this.rear = -1;
this.length = length;
queueStr = new String[length];
}
public void push(String s){
if(rear < queueStr.length - 1){
queueStr[++rear] = s;
}else{
print("error!\n");
}
}
public String pop(){
if(rear >= 0) {
String s = queueStr[0];
System.arraycopy(queueStr,1,queueStr,0,rear + 1);
rear--;
return s;
}else{
print("pop error!");
return null;
}
}
public String toString(){
String s = "";
for(int i = 0; i <= rear; i++){
s += queueStr[i] + " ";
}
return s;
}
private void print(String s){
System.out.print(s);
}
}
其实实现队列的主要难度是删除操作。因为为了避免“假溢出”,考虑移位,我去看了arraylist的实现,发现其remove方法使用了“System.arraycopy()”这个方法,就搬到这个程序来了!就是提醒一下自己,要多看这些大牛的源码!
队列的用途
队列和显示中的排队类似,经常用来模拟排队。看看后续写一个模拟程序吧。^_^