前言
队列先进先出,使用链表实现比较方便,这里使用单链表实现。涉及到入队列和出队列两个操作:
入队列:使用单链表头插法,入队的节点一直在队列序列的后面
出队列:得到倒数第二个节点,将最后一个节点释放空间并删除
边界情况:
空队列时出队列
定义链表结点
template<class T>
struct Node {
T m_data;
struct Node* m_next;
Node(T data) :m_data(data), m_next(nullptr) {}
};
队列实现
template<class T>
class queue {
private:
int m_size;
Node<T>* head;
//头插 从链表头结点前插入结点
void push_front(T& value) {
if (!head){
head = new struct Node<T>(value);
}
else{
auto tempNode = new struct Node<T>(value);
tempNode->m_next = head;
head = tempNode;
}
m_size++;
}
//尾删 利用m_size定位到倒数第二个节点,node.next 将其删除
bool pop_back() {
if (0 >= m_size)
return false;
if (1 == m_size)
{
delete head;
head = nullptr;
m_size--;
return true;
}
auto temNode = head;
for (int i = 0; i < m_size - 2; i++) {
temNode = temNode->m_next;
}
delete temNode->m_next;
temNode->m_next = nullptr;
m_size--;
return true;
}
public:
queue(int size = 0) :m_size(size) {
head = nullptr;
}
void Push_Queue(T& value) {
return push_front(value);
}
bool Pop_Queue() {
bool f = false;
assert(true == (f = pop_back() ));
return f;
}
void print() {
auto temp = head;
if (!m_size)
{
cout << "null";
cout << endl;
return;
}
while (temp) {
cout << "->" << temp->m_data;
temp = temp->m_next;
}
cout << endl;
}
};
push_front && pop_back
push_front就是链表的头插法,主要涉及几个步骤:
- 创建新节点
- 新节点的next = head
- 新节点成为头结点
1. tempnode = new Node(value);
2. tempnode->next = head;
3. head = tempnode;
pop_back,尾删的时候考虑时间挺长的,遍历一个单链表只能找到最后一个节点。于是引入一个size节点计数,来找到倒第二节点。
- 找到倒第二节点node
- node->next 就是最后一个节点
- 空间释放、置为空 delete node->next ;node->next = nullptr;