利用数组实现队列操作

题目:利用数组来实现队列的入队,出队,队列扩容等操作,写出具体实现代码。

解析:

首先应该知道队列最大的特点就是先进先出(FIFO),所以这里也就限制了队列只能进行入队,并且只能是从尾部入队,不能随意插入;出队也只能是从头开始一次出队;知道了这个特点就可以开始写代码了

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.lhb.test;

import java.util.Arrays;

/**
* @Program: netty-chat
* @Description:
* @Author: LHB
* @Version: v0.0.1
* @Time: 2021-11-02 09:17
**/
public class ArrayQueue<T> {
private Object[] data; // 队列数据
private int size = 2<<4; // 队列初始化大小
private int tail = 0; // 队尾
private int head = 0; // 对头
private final int maxCapcity = 2<<5; // 队列最大容量,超过这个最大容量,队列将不会再进行扩容

public ArrayQueue() {
this.data = new Object[size];
}

public ArrayQueue(int size) {
this.size = size;
this.data = new Object[size];
}

/**
* 入队操作
* @param data
*/
public void add(T data) {
/**
* 这里时间复杂度最好为O(1),即不进行扩容操作,最坏是在最后一步进行扩容操作,此时扩容的时候时间复杂度为O(n)
*
*/
try {
if (isFull()) {
// 队列满时进行扩容操作,扩容大小为原来容量的2倍
this.resize();
}
this.data[tail] = data;
tail++;
} catch (IndexOutOfBoundsException e) {
throw new IndexOutOfBoundsException("队列已满");
}
}

/**
* 队列是否已满
* @return
*/
public boolean isFull() {
return this.tail >= this.size;
}

/**
* 队列是否为空
* @return
*/
public boolean isEmpty() {
return head == tail;
}

/**
* 扩容操作
*/
public void resize() {
// 扩容时的容量是原来容量的二倍
this.size *= 2;
if (this.size >= this.maxCapcity) {
this.size = this.maxCapcity;
}
Object[] temp = new Object[this.size];
int tailTmp = 0;
for (int i = 0; head < tail; i++) {
/**
* 这里的时间复杂度为O(n)
*/
temp[i] = this.data[head++];
tailTmp++;
}
this.data = temp;
head = 0;
tail = tailTmp;
}

/**
* 出队列
* @return
*/
@SuppressWarnings("unchecked")
public T remove() {
if (isEmpty()) {
return null;
}
Object datum = this.data[head];
this.data[head++] = null;
return (T)datum;
}

@Override
public String toString() {
return "ArrayQueue{" +
"data=" + Arrays.toString(data) +
", size=" + size +
", tail=" + tail +
", head=" + head +
'}';
}

public static void main(String[] args) {
ArrayQueue<Integer> arrayQueue = new ArrayQueue<>(5);
arrayQueue.add(1);
arrayQueue.add(2);
arrayQueue.add(3);
arrayQueue.add(4);
arrayQueue.add(5);
arrayQueue.add(6);
arrayQueue.add(7);
arrayQueue.add(8);
arrayQueue.add(9);
arrayQueue.add(10);
arrayQueue.add(11);
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.remove());
System.out.println(arrayQueue.toString());
}
}

运行上述代码可以看到如下结果:

运行结果

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信