队列
我利用链表来实现队列,实现方法:
1.
初始化一个头指针,并创建一个尾指针指向头指针 ;
2.
入队时,利用入队元素创建一个新的节点,添加到链表的尾部,此时尾指针指向新添加的这个节点;
3.
出队时,判断队列是否为空,如果为空,则提示队列为空;如果不为空,则取出头指针指向的节点,调整头指针指向该节点指向的下一个节点,再判断此时队列是否为空,如果为空,则调整尾指针指向头指针,返回节点的值,free这个节点;
代码实现:
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
| #include <iostream>
using namespace std;
template<class T>
//链表节点
struct ListNode {
T val;
ListNode* next;
ListNode(T x){
val = x;
next = NULL;
};
};
template<class T>
class MyQueue{
ListNode<T>* head;
ListNode<T>* last;
int size;
public:
MyQueue(){
head = new ListNode<T>(NULL);
last = head;
size = 0;
}
~MyQueue(){
head = NULL;
last = NULL;
}
//判断队列是否为空
bool isEmpty(){
if (size==0) {
return true;
}else{
return false;
}
}
//入队
void offer(T value){
ListNode<T>* newNode = new ListNode<T>(value);
last->next = newNode;
last = newNode;
size++;
}
//查看队头元素
T peek(){
if (isEmpty()) {
cout<<"队列为空"<<endl;
exit(0);
}else{
return head->next->val;
}
}
//出队
T poll(){
if (isEmpty()) {
cout<<"队列为空"<<endl;
exit(0);
}else{
ListNode<T>* p = head->next;
T pVal = p->val;
head->next = p->next;
size--;
if (size==0) {
last = head;
}
free(p);
return pVal;
}
}
};
|