数据结构之队列

       距离上次写博客已经有一段时间了。最近又重新学习了数据结构的队列(用数组和链表分别实现)、链表以及霍夫曼树。作为一名大三的学生,这些其实早已经接触过。无奈当初转专业,修数据结构的时候没有修C++,而我们的数据结构就是用C++讲的,于是那个学期我听得很悲剧。如何呼天抢地度过期末的情节依然历历在目。

        言归正传,下面我用数组实现的队列作一下演示。

 

    队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

     队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

                                                                   ------From Wikipedia

 

【一】练习使用,我新建了一个学生类,用来存储相关数据。

 

package cn.wly.ArrayQueue;

/**
 * 学生类
 * @author LucyWong
 *
 */
public class Student{
	private String name;//学生姓名
	private int score;	//学生成绩
	
	public Student(String name,int score){
		this.name = name;
		this.score = score;
	}
	
	public void setName(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	public void setScore(int score){
		this.score = score;
	}
	
	public int getScore(){
		return score;
	}
	
	//返回一个字符串包括名字和成绩
	public String toString(){
		return "name = "+this.name+"   score = "+this.score;
	}
}

 【二】接着,写数组队列ArrayQueue类

 

 

package cn.wly.ArrayQueue;

/**
 * 定义一个数组队列类
 * @author LucyWong
 *
 */
public class ArrayQueue {
	//创建一个数组对象
	private Student [] arrayQueue = new Student[0];
        private int size;
	
	/**
	 * 在队列中尾部添加1个元素
	 * @param stu
	 */
	public void add(Student stu){
		//新创建一个数组,长度比arrayQueue大1
		Student [] newArray = new Student[arrayQueue.length+1];
		//将要添加的元素的值赋给newArray的最后一个元素
		newArray[arrayQueue.length] = stu;
		//将arrayQueue的所有元素值赋给newArray对应位置的元素
		for(int i=0; i<arrayQueue.length; i++){
			newArray[i] = arrayQueue[i];
		}
		//最后arrayQueue指向newArray的首地址
		arrayQueue = newArray;
	}
	
	/**
	 * 删除元素,由于是先入先出FIFO,所以只能从队列第一个元素开始删除
	 * @param index
	 */
		public void delete(){
		//新创建一个数组,长度比arrayQueue小1
		Student [] newArray = new Student[arrayQueue.length-1];
		//将arrayQueue的所有元素值赋给newArray对应位置的元素
		for(int i=0; i<newArray.length; i++){
			newArray[i] = arrayQueue[i+1];
		}
		//最后arrayQueue指向newArray的首地址
		arrayQueue = newArray;
	}

        /**
	 * 获得指定位置的元素
	 */
	public Student get(int i){
		 if (i < 0 || i>size()) {
			throw new java.lang.RuntimeException("下标越界");//若下标越界,抛出一个异常
		}
		 return arrayQueue[i];
	 }		
	
	/**
	 * 返回队列长度
	 * @return
	 */
	 public int size(){
		 return arrayQueue.length;
	 }
}

       在ArrayQueue里,有两种修改的队列公有方法,分别是在队列尾部添加,在队列头部删除元素。

 

其实原理很简单,就是在方法里面新创建一个数组,删除的话就新创建长度比arrayQueue小一的,添加的话就新创建长度比arrayQueue大一的。

       如果想要在任意位置添加、删除,那就是用链表了。

 

【三】测试

 

package cn.wly.ArrayQueue;

public class QueueTest {

	public static void main(String[] args) {
		ArrayQueue stu = new ArrayQueue();
		//添加元素
		stu.add(new Student("Lucy",90));
		stu.add(new Student("Bob",98));
		stu.add(new Student("Jessica",88));
		stu.add(new Student("Lora",80));
		
		//打印
		for(int i=0; i<stu.size(); i++){
			System.out.println("第"+(i+1)+"个学生"+stu.get(i));
		}
		
		//删除元素
		stu.delete();
		stu.delete();
		
		//打印
		for(int i=0; i<stu.size(); i++){
			System.out.println("第"+(i+1)+"个学生"+stu.get(i));
		}	
	}
}

 

 

       运行,就能够在控制台看到输出的结果。

       第1个学生name = Lucy   score = 90

       第2个学生name = Bob   score = 98

       第3个学生name = Jessica   score = 88

       第4个学生name = Lora   score = 80

       第1个学生name = Jessica   score = 88

       第2个学生name = Lora   score = 80

 

       时间有限,之后会更新链表章节。

        

你可能感兴趣的:(数据结构)