1.队列的定义及特点
队列(queue)是指允许在一端进行插入操作,在另一端进行删除操作的线性表
特点:1.队列是一种先进先出的线性表
2.允许插入的一端称之为队尾,允许删除的一端称之为队头
队列是操作受到限制的线性表
与其他线性表不同的是,数据结构中的队列只能从队尾添加元素,在对头删除元素,这是由它的逻辑结构决定的。
2.队列的顺序存储结构—使用顺序表
使用数组保存队列元素
front:头指针
rear:队尾指针
使用顺序表表示队列的缺点:队列已满,无法继续在队尾插入元素,数组仍然有空闲空间,造成了空间的浪费—假溢出。
3.循环队列
循环队列是队列头尾相接的顺序存储结构。
特点:数组未满的时候都可以插入新的队尾元素
处理队满和队空有两种方法
1.少用一个空间元素,即队列空间大小为Maxsize时,有Maxsize-1个元素就认为是队满
2.单独设置一个标识符以便于区别队列是否为空状态。
队列为空:rear==front==0;
队列已满:(rear+1)%Maxsize==front
4.循环队列的实现细节和注意要点
1.要定义队列头部,队列尾部,元素个数,数组长度。
2.定义插入队列的方法:首先要判断队列是否满了,如果没满,就将传入的参数赋值给当前rear指向的array[rear],完成赋值之后,count++,因为这个是循环队列,所以如果rear指向了最后一位,那么就要规定下一个rear就指向了首位,rear=0.
2.定义出队列方法:其中front的处理方法和rear一样。
3.可以通过count定义队列是否为满或者空的方法。
quequ类:
1 package Queue; 2 /** 3 * @类名 Queue.java 4 * @作者 修仙小华 5 * @版本 V1.0 6 * @日期 2019年7月24日-下午2:32:09 7 * @描述 8 */ 9 public class Queue { 10 private int front=0;//队列头部 11 private int rear=0;//队列尾部 12 private int count=0;//元素个数 13 private int MaxSize=5;//数组最大值 14 String array[] =new String[MaxSize]; 15 /** 16 * 插入队列 17 */ 18 public void push(String data) { 19 if (isFull()!=true) { 20 array[rear]=data; 21 count++; 22 if ((rear)==(MaxSize-1)) { 23 rear=0; 24 }else { 25 rear++; 26 } 27 }else { 28 return; 29 } 30 } 31 /** 32 * 出队列 33 */ 34 public String pop() { 35 if (isEmpty()!=true) { 36 this.count--; 37 int temp=front; 38 if ((front)==(MaxSize-1)) { 39 front=0; 40 }else { 41 front++; 42 } 43 return array[temp]; 44 }else { 45 return null; 46 } 47 } 48 /** 49 * 看看队首数据 50 */ 51 public String peek() { 52 return array[front]; 53 } 54 /** 55 * 判断队列是否为空,为空返回true 56 */ 57 public boolean isEmpty() { 58 if (count==0) { 59 return true; 60 }else { 61 return false; 62 } 63 } 64 /** 65 * 判断队列是否满了 66 */ 67 public boolean isFull() { 68 if (count==MaxSize) { 69 return true; 70 }else { 71 return false; 72 } 73 } 74 /** 75 * 队列长度 76 */ 77 public int Count() { 78 return this.count; 79 } 80 }
测试类:
1 public class QueueTest { 2 public static void main(String[] args) { 3 Queue qu=new Queue(); 4 qu.push("张三"); 5 qu.push("李四"); 6 qu.push("王二"); 7 qu.push("麻子"); 8 qu.push("袁帅"); 9 System.out.println(qu.Count()); 10 System.out.println(qu.isEmpty()); 11 System.out.println(qu.peek()); 12 qu.pop(); 13 qu.pop(); 14 qu.pop(); 15 qu.pop(); 16 qu.push("张三"); 17 qu.push("李四"); 18 qu.push("王二"); 19 qu.push("麻子"); 20 qu.pop(); 21 System.out.println(qu.Count()); 22 System.out.println(qu.peek()); 23 } 24 25 }