首页 > 代码库 > 数据存储--队列

数据存储--队列

队列:

  类似于生活中的排队购票系统,排头的人总是最先到的,也是最先取到票的。即先入先出,跟栈的后入先出是不同的。

  误区:算法里的队列并不会像生活剧中一样,排头走后,后面的跟着前移一步,队列是一种存放数据的工具,从底部开始存数据,存放一个到排尾,数据的访问权就上移一位,取出排头的一个,数据的访问权也上移一位。

  某一时刻的队列图如下:

 技术分享

 此时的队列,只能存入两个数据,但还有三个空的单元。

       更加实用的队列设计是环绕式处理。当添加数据到队列顶端时,先判断队列是否为空,然后将队尾指针循环到队列底端。

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 }

 

数据存储--队列