- Stack、Queue的底层的容器用的都是双端队列(deque)。
- Stack的模拟实现(后进先出):插入、删除、取栈顶元素、栈的大小、判空。
(插入、删除、取栈顶元素都是在尾部实现的)。
template <classT ,class Con = deque<T>>//Con---Container的缩写,容器类型,这里使用deque为适配器。
class Stack{
public:
Stack() {}
void Push(const T&x){
_c.push_back(x);
}
void Pop(){
_c.pop_back();
}
T& Top(){
return _c.back();//取尾部的元素(栈顶)
}
size_t Size(){
return _c.size();
}
bool Empty(){
return _c.empty();
}
private:
Con _c;
};
int main (){
Stack<int> st;
st.Push(1);
st.Push(2);
st.Push(3);
st.Push(4);
cout << st.top() << endl;
st.Pop();
cout << "Size:" << st.Size() << endl;
cout << "Empty:" << st.Empty() << endl;
return 0;
}
结果如下:
- Queue的模拟实现(先进先出):插入、删除、取队尾元素、取队顶元素、队列的大小、判空。
注意:不能在类的内部定义Print函数来打印数据:
void Print(){
while(!Empty()){
cout << _c.front() << endl;
_c.pop_front();
}
等这一次打印完,元素都被删除完了。
所以,只能在类的外部实现数据的打印。
template <class T ,class Con = deque<int>>
class Queue{
public:
Queue() {}
void Push(const T& x){
_c.push_back(x);
}
void Pop(){
_c.pop_front();
}
T& Back(){
return _c.back();//取尾部元素
}
T& Front(){
return _c.front();//取头部元素
}
size_t Size(){
return _c.size();
}
boll Empty(){
return _c.empty();
}
private:
Con _c;
};
int main (){
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
cout << "队头元素:" << q.Front() << endl;
cout << "队尾元素:" << q.Back() << endl;
cout << "队列的大小:" << q.Size() << endl;
cout << "队列是否为空:" << q.Empty() << endl;
}
结果如下:
- Priority_queue的模拟实现:插入、删除、取队顶元素、优先级队列的大小、判空。
- 优先级队列的底层是vector适配器,默认其为大堆(插入的时候要向上调整,删除的时候要向下调整),调整的时候,参数给的是数组的下标。
注意:在进行向下调整算法的时候,要控制child、child+1的下标都在正确的范围内。
template <class T, class Con = vector<T&>>
class Priority_queue{
public:
void Push(const T& x){
_c.push_back(x);
Adjustup(_c.size()-1);
}
void Adjustup(int child){
int parent = (child-1)/2;
while (child >0){
if (_c[child] > _c[parent]){
swap(_c[child],_c[parent]);
child = parent;
parent = (child-1)/2;
}
else{
break;//如果不符合条件,就要退出while循环。
}
}
}
void Pop(){
swap(_c[0],_c[_c.size()-1]);
_c.pop_back();//利用尾删
Adjustdown(0);
}
void Adjustdown(int root){
int parent = root;
int child = parent*2+1;
while(child < _c.size()){
if **(child+1 < _c.size() && _c[child]< _c[child+1])**{
swap(_c[child],_c[child+1]);
}
if (_c[parent] < _c[child]){
swap(_c[parent],_c[child]);
parent = child;
child = parent*2+1;
}
else{
break;
}
}
T& top(){
return **_c[0];**
}
size_t Size(){
return _c.size();
}
bool Empty(){
return _c.empty();
}
private:
Con _c;
};
int main (){
Priority_queue<int> pq;
pq.Push(1);
pq.Push(2);
pq.Push(3);
pq.Push(4);
cout << pq.top() << endl;
while (pq.Size()){
cout << pq.Top() << " ";
pq.Pop();
}
cout << endl;
cout << "Size:" << pq.Size() << endl;
cout << "Empty:" << pq.Empty() << endl;
结果如下: