
C++ STL-stack/queue/priority_queue
目录
C++ STL-stack/queue/priority_queue
●1.stack的使用
●2.stack的模拟实现
●3.queue的使用
●4.queue的模拟实现
●5.priority_queue的使用
●6.priority_queue的模拟实现
1.stack的使用
| 函数说明 | 接口说明 | 
|---|---|
| stack() | 构造空的栈 | 
| empty() | 检测stack是否为空 | 
| size() | 返回stack中元素的个数 | 
| top() | 返回栈顶元素的引用 | 
| push() | 将元素val压入stack中 | 
| pop() | 将stack中尾部的元素弹出 | 
示例1:
            
            
              c++
              
              
            
          
          void test()
{
       stack<int> s;
       cout << s.empty() << endl;//1
       cout << s.size() << endl;//0
       s.push(1);
       s.push(2);
       s.push(3);
       s.push(4);
       s.push(5);
       cout << s.empty() << endl;//0
       cout << s.size() << endl;//5
       cout << s.top() << endl;//5
       s.pop();
       cout << s.top() << endl;//4
       s.pop();
       cout << s.top() << endl;//3
       s.pop();
       cout << s.top() << endl;//2
       cout << s.size() << endl;//2
}示例2:最小栈问题的解题思路 
示例3:栈的压入、弹出序列问题的解题思路 
示例4:逆波兰表达式问题的解题思路 
2.stack的模拟实现
示例代码:
            
            
              c++
              
              
            
          
          namespace myStack
{
       template<class T,class Container=deque<T>>    //适配器
       class stack
       {
       public:
               void push(const T& x)
               {
                      _con.push_back(x);
               }
               void pop()
               {
                      _con.pop_back();
               }
               const T& top()
               {
                      return _con.back();
               }
               bool empty()
               {
                      return _con.empty();
               }
               size_t size()
               {
                      return _con.size();
               }
       private:
               Container _con;//适配器
       };
}3.queue的使用
| 函数声明 | 接口说明 | 
|---|---|
| queue() | 构造空的队列 | 
| empty() | 检测队列是否为空,是返回true,否则返回false | 
| size() | 返回队列中有效元素的个数 | 
| front() | 返回队头元素的引用 | 
| back() | 返回队尾元素的引用 | 
| push() | 在队尾将元素val入队列 | 
| pop() | 将队头元素出队列 | 
示例:
            
            
              c++
              
              
            
          
          void test()
{
       queue<int> q;
       cout << q.empty() << endl;//1
       cout << q.size() << endl;//0
       q.push(1);
       q.push(2);
       q.push(3);
       q.push(4);
       q.push(5);
       cout << q.empty() << endl;//0
       cout << q.size() << endl;//5
       cout << q.front() << endl;//1
       cout << q.back() << endl;//5
       q.pop();
       cout << q.empty() << endl;//0
       cout << q.size() << endl;//4
       q.pop();
       cout << q.front() << endl;//3
       cout << q.back() << endl;//5
}4.queue的模拟实现
示例代码:
            
            
              c++
              
              
            
          
          namespace myQueue
{
       template<class T, class Container = deque<T>>
       class queue
       {
       public:
               void push(const T& x)
               {
                      _con.push_back(x);
               }
               void pop()
               {
                      _con.pop_front();
               }
               const T& front()
               {
                      return _con.front();
               }
               const T& back()
               {
                      return _con.back();
               }
               bool empty()
               {
                      return _con.empty();
               }
               size_t size()
               {
                      return _con.size();
               }
       private:
               Container _con;
       };
}5.priority_queue的使用
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。
| 函数声明 | 接口说明 | 
|---|---|
| priority_queue()/priority_queue(first,last) | 构造一个空的优先级队列 | 
| empty() | 检测优先级队列是否为空,是返回true,否则返回false | 
| top() | 返回优先级队列中最大(最小元素),即堆顶元素 | 
| push(x) | 在优先级队列中插入元素x | 
| pop() | 删除优先级队列中最大(最小)元素,即堆顶元素 | 
示例1:内置数据类型
            
            
              c++
              
              
            
          
          #include<functional>  //greater算法的头文件
void test()
{
       //默认定义为大顶堆
       priority_queue<int> pq;
       cout << pq.empty() << endl;//1
       pq.push(17);
       pq.push(90);
       pq.push(42);
       pq.push(45);
       pq.push(37);
       pq.push(52);
       pq.push(8);
       pq.push(7);
       pq.push(32);
       pq.push(61);
       cout << pq.empty() << endl;//0
       while (pq.size() != 0)
       {
               cout<<pq.top()<<" ";
               pq.pop();
       }
       cout << endl;//90 61 52 45 42 37 32 17 8 7
       cout << pq.empty() << endl;//1
 
       //自定义定义为小顶堆
       vector<int> v{ 17, 90, 42, 45, 37 ,52, 8,7,32,61};
       auto p = v.begin();
       auto q = v.end();
       priority_queue<int,vector<int>,greater<int>> pq1(p, q);
       cout << pq1.empty() << endl;//0
       while (pq1.size() != 0)
       {
               cout << pq1.top() << " ";
               pq1.pop();
       }
       cout << endl;//7 8 17 32 37 42 45 52 61 90
}示例2:自定义数据类型
            
            
              c++
              
              
            
          
          class Date {
       friend ostream& operator<<(ostream& _cout, const Date& d);
public:
       Date(int year=2025,int month=1,int day=1)
               :_year(year),_month(month),_day(day)
       {
       }
 
       bool operator<(const Date& d)const
       {
               if (this->_year == d._year)
               {
                      if (this->_month == d._month)
                      {
                              if (this->_day < d._day)
                              {
                                     return true;
                              }
                              return false;
                      }
                      return false;
               }
               return false;
       }
 
       bool operator>(const Date& d) const
       {
               if (this->_year == d._year)
               {
                      if (this->_month == d._month)
                      {
                              if (this->_day > d._day)
                              {
                                     return true;
                              }
                              return false;
                      }
                      return false;
               }
               return false;
       }
private:
       int _year;
       int _month;
       int _day;
};
ostream& operator<<(ostream& _cout,const Date& d)
{
       _cout << d._year << " " << d._month << " " << d._day;
       return _cout;
}
void test1()
{
       priority_queue<Date> d1;
       d1.push(Date(2025,1,20));
       d1.push(Date(2025,1,28));
       d1.push(Date(2025, 1, 30));
       cout << d1.top() << endl;//2025 1 30
 
       priority_queue<Date,vector<Date>,greater<Date>> d2;
       d2.push(Date(2025, 1, 20));
       d2.push(Date(2025, 1, 28));
       d2.push(Date(2025, 1, 30));
       cout << d2.top() << endl;//2025 1 20
}示例3:数组中的第K个最大元素问题的解题思路 
6.priority_queue的模拟实现
代码示例:
            
            
              c++
              
              
            
          
          namespace myPriorityqueue
{
       /*仿函数*/
       template<class T>
       class Less {
       public:
               bool operator()(const T& x, const T& y)
               {
                      return x < y;
               }
       };
       template<class T>
       class Greater {
       public:
               bool operator()(const T& x, const T& y)
               {
                      return x > y;
               }
       };
       template<class T,class  Container=vector<T>,class compare=Less<T>>
       class priority_queue {
       public:
               void adjust_up(int child)
               {
                      compare com;
                      int parent = (child - 1) / 2;
                      while (child!=0)
                      {
                              if (com(_con[child] , _con[parent]))
                              {
                                     swap(_con[child],_con[parent]);
                                     child = parent;
                                     parent = (parent - 1) / 2;
                              }
                              else
                              {
                                     break;
                              }
                      }
               }
               void push(const T& x)
               {
                      _con.push_back(x);
                      adjust_up(_con.size()-1);
               }
               void adjust_down(int parent)
               {
                      compare com;
                      int child = 2 * parent + 1;
                      while (child <_con.size())
                      {
                              
                              if (child + 1 < _con.size() && com(_con[child + 1],  _con[child]))
                              {
                                     ++child;
                              }
                              if (com(_con[child] , _con[parent]))
                              {
                                     swap(_con[child], _con[parent]);
                                     parent = child;
                                     child = 2 * child + 1;
                              }
                              else
                              {
                                     break;
                              }
                      }
               }
               void pop()
               {
                      swap(_con[0], _con[_con.size() - 1]);
                      _con.pop_back();
                      adjust_down(0);
               }
               const T& top()
               {
                      return _con[0];
               }
               bool empty()
               {
                      return _con.empty();
               }
               size_t size()
               {
                      return _con.size();
               }
       private:
               Container _con;
       };
}<您的三连和关注是我最大的动力>
🚀 文章作者:张同学的IT技术日记
分类专栏:C++系列