手撕队列(基于数组)

  • 关键点在于头指针和尾指针在队列清空时的调整(MyQueue::pop()),不当的操作可能导致清空后的空间无法重复使用,不断扩容。
  • 可对扩容操作(MyQueue::push())做进一步优化(数据前移)。
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
#include<iostream>
using namespace std;

template <typename T>
class MyQueue
{
private:
T* _data;
int _front;
int _rear;
int _size;
int _capacity;

public:
MyQueue();
MyQueue(int capacity);
~MyQueue();
T front();
T back();
T size();
T pop();
bool empty();
void push(T num);
};

template <typename T>
MyQueue<T>::MyQueue() : _front(0), _rear(0), _size(0), _capacity(4)
{
_data = new T[4];
}

template <typename T>
MyQueue<T>::MyQueue(int capacity) : _front(0), _rear(0), _size(0), _capacity(capacity)
{
_data = new T[capacity];
}

template <typename T>
MyQueue<T>::~MyQueue()
{
delete[] _data;
_data = nullptr;
}

template <typename T>
T MyQueue<T>::front()
{
if (_size == 0) throw "队列为空";
return _data[_front];
}

template <typename T>
T MyQueue<T>::back()
{
if (_size == 0) throw "队列为空";
return _data[_rear];
}

template <typename T>
T MyQueue<T>::size()
{
return _size;
}

template <typename T>
T MyQueue<T>::pop()
{
if (_size == 0) throw "队列为空";
T value = _data[_front];
_front = (_front + 1) % _capacity;
if (_front == 0) _rear = 0;
--_size;
return value;
}

template <typename T>
bool MyQueue<T>::empty()
{
return _size == 0;
}

template <typename T>
void MyQueue<T>::push(T element)
{
if (_rear == _capacity)
{
_capacity *= 2;
T* newData = new T[_capacity];
for (int i = 0; i < _rear; ++i)
{
newData[i] = _data[i];
}
delete[] _data;
_data = newData;
newData = nullptr;
}
_data[_rear] = element;
++_rear;
++_size;
}

手撕队列(基于链表)

1
待更新