必看!用示例代码学C++ STL-stack/queue/priority_queue,快速掌握基础知识,高效提升编程能力

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++系列

相关推荐
陈随易1 小时前
10年老前端,分享20+严选技术栈
前端·后端·程序员
汪子熙1 小时前
计算机世界里的 blob:从数据库 BLOB 到 Git、Web API 与云存储的二进制宇宙
后端
鞋尖的灰尘1 小时前
springboot-事务
java·后端
元元的飞1 小时前
6、Spring AI Alibaba MCP结合Nacos自动注册与发现
后端·ai编程
Cisyam1 小时前
Go环境搭建实战:告别Java环境配置的复杂
后端
六月的雨在掘金2 小时前
狼人杀法官版,EdgeOne 带你轻松上手狼人杀
前端·后端
绝无仅有2 小时前
使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线
后端·面试·github
张同学的IT技术日记2 小时前
必看!用示例代码学 C++ 继承,快速掌握基础知识,高效提升编程能力
后端
杨杨杨大侠2 小时前
10 - 性能优化和扩展 🚀
后端·开源·workflow