算法——Java实现队列

2022-05-09 15:33:38 浏览数 (1)

顺序队列:

概念:

队列是一种先进先出的线性表,只允许在一端插入,另一端删除。允许插入的一端称为队尾,允许删除的一端称为队头

顺序队列的实现:

代码语言:javascript复制
 1 import org.junit.jupiter.api.Test;
 2 
 3 /**
 4  *   顺序队列
 5  * @author wydream
 6  *
 7  */
 8 
 9 public class QueueSequence {
10 
11     private String[] arr;//队列数组
12     private int end=0;//队尾标志
13     
14     //向队列中添加元素
15     public void push(String[] arr,String value) {
16         if(end<arr.length) {
17             arr[end]=value;
18             end  ;
19             return;
20         }else {
21             System.out.println("队列已经满了");
22             return;
23         }
24         
25     }
26     
27     //取出队列元素
28     public String pop(String[] arr) {
29         String rs;
30         if(arr[0]==null) {
31             System.out.println("队列为空,请先向队列中添加元素");
32             return null;
33         }else {
34             rs=arr[0];
35             arr[0]=null;
36             move(arr);
37             return rs;
38         }
39     }
40     
41     //队列元素向前移动
42     public void move(String[] arr) {
43         for(int i=0;i<arr.length-1;i  ) {
44             if(arr[i 1]!=null) {
45                 arr[i]=arr[i 1];
46             }else{
47                 arr[i]=null;
48                 break;
49             }
50         }
51     }
52     
53     
54     
55     
56     @Test
57     public void test() {
58         String[] arr=new String[10];
59         push(arr,"北京");
60         push(arr,"上海");
61         push(arr,"广东");
62         push(arr,"杭州");
63         push(arr,"苏州");
64         push(arr,"扬州");
65         pop(arr);
66         pop(arr);
67         pop(arr);
68         pop(arr);
69     }
70     
71 }

循环队列:

概念:

  • 顺序队列的不足:顺序队列在进行插入操作时,直接在队尾插入就可以,此时时间复杂度为O(1),但是在出列是在队头,即下标为0的位置,也就意味着队列中所有的元素都得向前移动,此时时间复杂度为0(n),效率较低。
  • 队列出列时不需要所有的元素都移动,引入两个指针即可,一个头指针front指向队头元素,一个尾指针rear指向队尾元素,此时队列出列只需移动指针即可。但是此种情况下会出现一种溢出情况(如下图),此时队列中任然是有空间的可以存放元素的,但是尾指针已经溢出,于是就有了循环队列。
  • front指向队头,rear指向队尾的下一个位置;队为空的判断:front==rear;队为满的判断:(rear 1)%MAXSIZE==front

实现循环队列:

代码语言:javascript复制
 1 /**
 2  *   java实现循环队列
 3  * @author wydream
 4  *
 5  */
 6 
 7 import org.junit.jupiter.api.Test;
 8 
 9 public class QueueArray {
10 
11     Object[] arr=new Object[10];;//对象数组,队列最多存储a.length-1个对象 
12     int front=0;//队首下标
13     int rear=0;//队尾下标
14     
15     /**
16      *  将一个对象追加到队列尾部
17      */
18     public boolean enqueue(Object obj) {
19         if((rear 1)%arr.length==front) {
20             return false;
21         }
22         arr[rear]=obj;
23         rear=(rear 1)%arr.length;
24         return true;
25     
26     }
27     
28     //出队列
29     public Object dequeue() {
30         if(rear==front) {
31             return null;
32         }
33         Object obj=arr[front];
34         front=(front 1)%arr.length;
35         return obj;
36     }
37     
38     @Test
39     public void test() {
40         QueueArray q=new QueueArray();
41         System.out.println(q.enqueue("北京"));
42         System.out.println(q.enqueue("上海"));
43         System.out.println(q.enqueue("广东"));
44         System.out.println(q.enqueue("深圳"));
45         for(int i=0;i<4;i  ){   
46             System.out.println(q.dequeue());   
47         }   
48     }
49     
50         
51 }

0 人点赞