C++中:利用适配器,Stack,Queue,[Priority_queue]的模拟实现。

  • 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;

结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Darling_sheeps/article/details/88849733