队列:
类似于生活中的排队购票系统,排头的人总是最先到的,也是最先取到票的。即先入先出,跟栈的后入先出是不同的。
误区:算法里的队列并不会像生活剧中一样,排头走后,后面的跟着前移一步,队列是一种存放数据的工具,从底部开始存数据,存放一个到排尾,数据的访问权就上移一位,取出排头的一个,数据的访问权也上移一位。
某一时刻的队列图如下:
此时的队列,只能存入两个数据,但还有三个空的单元。
更加实用的队列设计是环绕式处理。当添加数据到队列顶端时,先判断队列是否为空,然后将队尾指针循环到队列底端。
java实现:
1 package com.test; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 queue q = new queue(4); 8 q.insert(1); 9 q.insert(2); 10 q.insert(3); 11 12 long f = q.peekFront(); 13 System.out.println("队头元素:"+f); 14 15 q.remove(); 16 17 long f2 = q.peekFront(); 18 System.out.println("队头元素:"+f2); 19 20 21 } 22 } 23 24 /** 25 * 队列 26 * @author jingxin 27 * 28 */ 29 class queue{ 30 private int maxSize; // 队列大小 31 private long[] queArray; // 基于数组 32 private int front; // 队头 33 private int rear; // 队尾 34 private int nEelms; // 数组元素下标 35 36 public queue(int s){ 37 maxSize = s; 38 queArray = new long[maxSize]; 39 front = 0; 40 rear = -1; 41 nEelms = 0; 42 } 43 44 // 添加元素 45 public void insert(long i){ 46 // 队尾已到顶了 47 if(rear==maxSize-1){ 48 rear = -1; // 队尾指针环绕到最低端 49 } 50 queArray[++rear] = i; // 指针先上移 51 nEelms++; // 元素个数加1 52 } 53 54 // 移除元素(移除队头元素,当然也可以设计移除队尾元素) 55 public long remove(){ 56 if(nEelms!=0){ 57 long temp = queArray[front++]; // 移除后指针上移 58 if(front==maxSize){ 59 front = 0; 60 } 61 nEelms--; 62 return temp; 63 }else{ 64 return -1; 65 } 66 67 } 68 69 // 查看队头 70 public long peekFront(){ 71 return queArray[front]; 72 } 73 74 public boolean isEmpty(){ 75 return nEelms==0; 76 } 77 78 public boolean isFull(){ 79 return nEelms == maxSize; 80 } 81 82 public int size(){ 83 return nEelms; 84 } 85 }
时间: 2024-09-30 15:17:01