手撕STL——队列的内部实现
Posted 蒟蒻一枚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手撕STL——队列的内部实现相关的知识,希望对你有一定的参考价值。
前言
队列小伙伴们一定不陌生,本节课蒟蒻君来带大家学习队列的内部实现。
代码(链表存储)
#include <bits/stdc++.h>
using namespace std;
// 定义链表
template<class T>
struct node {
T num;
node<T>* nxt;
};
template<class T>
class MyQueue {
private:
node<T>* _Front;
node<T>* _rear;
public:
// 构造函数:队首队尾开辟空间
MyQueue() {
_Front = _rear = new node<T>;
_Front -> nxt = NULL;
}
// 析构函数:销毁队列
~MyQueue();
// 元素入队
void _push(T x);
// 队首出队
void _pop();
// 队列长度
size_t _size();
// 队列是否为空
bool _empty();
// 队首元素
T _front();
};
template<class T>
MyQueue<T> :: ~MyQueue() {
while (_Front != NULL) {
_rear = _Front -> nxt;
delete _Front;
_Front = _rear;
}
delete _rear;
}
template<class T>
void MyQueue<T> :: _push(T x) {
node<T>* p = new node<T>;
p -> num = x;
_rear -> nxt = p;
_rear = p;
_rear -> nxt = NULL;
}
template<class T>
void MyQueue<T> :: _pop() {
// 如果队列已经空了就报错
if (_empty()) {
throw"_empty";
}
node<T>* p = _Front -> nxt;
_Front -> nxt = p -> nxt;
delete p;
}
template<class T>
size_t MyQueue<T> :: _size() {
node<T>* p = _Front;
size_t sizes = 0;
while (p != _rear) {
p = p -> nxt;
++sizes;
}
return sizes;
}
template<class T>
bool MyQueue<T> :: _empty() {
return _Front == _rear;
}
template<class T>
T MyQueue<T> :: _front() {
return _Front -> nxt -> num;
}
int main() {
// 测试
MyQueue<int> q;
q._push(1);
cout << q._front() << '\\n';
q._push(2);
cout << q._size() << '\\n';
q._pop();
cout << q._empty() << '\\n';
return 0;
}
以上是关于手撕STL——队列的内部实现的主要内容,如果未能解决你的问题,请参考以下文章