STL容器篇之stack和queue

简介: STL容器篇之stack和queue

stack

1.栈的存储顺序是固定的,先进后出的存储顺序

2.栈是不存在迭代器的

运用

1.使用容器还是要使用头文件 stack

2.

常用的内置函数

push() 入栈 ->相当于尾插

pop() 出栈->相当于尾删

top() 获取头部元素

初始化

stack<类型名> 对象

#include<iostream>
#include<string>
#include<stack>  //同样的使用stack容器,要使用相应的头文件
using namespace std;
int main()
{
  stack<int> istack;
  for (int i = 0; i < 4; i++)
  {
    istack.push(i);  //入栈  相当于尾插 push_back()
  }
  while (!istack.empty())  //判断是否为空(istack中是否有数据)
  {
    cout << istack.top(); //打印栈的头部元素
    istack.pop();     //出栈相当于尾删   pop_back();
  }
  system("pause");
  return 0;
} 

案例一:十进制变为二进制

#include<iostream>
#include<stack>
using namespace std;
int main()
{
  int number = 100;
  stack<int> istack;
  while (number != 0)
  {
    istack.push(number % 2);
    number /= 2;
  }
  while (!istack.empty())  //栈的基本操作
  {
    cout << istack.top();
    istack.pop();
  }
  system("pause");
  return 0;
}

案例二:十进制转化为十六进制

char类型和int类型的转化

主要原理是根据ASCII码

int类型变成char类型,只需要加上一个’0’,便可以

例如 :1 + ‘0’ = ‘1’

相反:char类型变成一个Int类型,只需要
减去一个’0’
,便可以

例如: ‘1’ - ‘0’ = 1

下面是代码的实现

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
  stack<char> cstack; //注意用字符型
  int number = 999;
  while (number) //number 不为0的时候,进行循环
  {
    if (number % 16 < 10)     //注意这里的两种情况的转化
    {
      cstack.push(number % 16 + '0');
    }
    else
    {
      cstack.push(number % 16 - 10 + 'A');
    }
    number /= 16;
  }
  while (!cstack.empty())
  {
    cout << cstack.top();
    cstack.pop();
  }
  system("pause");
  return 0;
}

queue

队列存储的顺序也是特定的,普通队列,先进先出,优先队列,按照优先权出队。

这有3种

1.queue

2.deque

3.priority_queue

queue(普通队列)

这基本操作跟上面stack差不多

#include<iostream>
#include<queue>
using namespace std;
int main()
{
  queue<int> iqueue;
  for (int i = 0; i < 3; i++)
  {
    iqueue.push(i);
  }
  cout << iqueue.size() << endl; //打印大小
  cout << iqueue.back() << endl;  //打印尾部的元素
  while (!iqueue.empty())
  {
    iqueue.front();  //打印头部元素
    iqueue.pop();  //出栈
  }
  //基本操作跟stack 差不多
  system("pause");
  return 0;
}

deque(双向队列)

有尾插,尾删,头插,头删

#include<iostream>
#include<deque>
#include<string> 
using namespace std;
int main()
{
  deque<string> date1;
  date1.push_back("尾插");
  date1.push_front("头插");
  //相对应的,头插,用头删
  //尾插,用尾删
  while (!date1.empty())
  {
    cout << date1.front();
    date1.pop_front();
  }
  deque<string> date2;
  date2.push_front("温柔了");
  date2.push_back("岁月");
  while (!date2.empty())
  {
    cout << date2.back();
    date2.pop_back();
  }
}

priority_queue### 用法

priority_queue(类型,容器,比较的方法);

priority_queue(类型,容器);

如果不用比较的方法(就会采用系统默认的(less<参数>))

当然比较的方法也可以自己写

less表示数字越大优先级越大,>greater表示数字越小,优先级越大。

使用

基本使用

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main()
{
  priority_queue<int, vector<int>, less<int>> date1;
  priority_queue<int, vector<int>>  date2;
  //date1和date2 是一样的,不写最后一个参数,系统默认是less<参数类型>
  srand((unsigned int)time(nullptr));
  for (int i = 0; i < 100; i++)
  {
    date1.push(rand() % 100);
  }
  while (!date1.empty())
  {
    cout << date1.top() << endl;;
    date1.pop();
  }
  system("pause");
  return 0;
}

操作自定义类型

#include<iostream>
#include<queue>
#include<vector>
#include<string>
using namespace std;
class MM
{
public:
  MM(int age, string name): age(age), name(name) {}
  string getName() const
  {
    return name;
  }
  int getAge() const
  {
    return age;
  }
  bool operator < (const MM& object) const
  {
    return this->age < object.age;
  }
  friend ostream& operator << (ostream out, MM& object1) 
  {
    out << object1.age << object1.name;
    return out;
  }
private:
  int age;
  string name;
};
int main()
{
  priority_queue<MM, vector<MM>, less<MM>> date1;
  date1.push(MM(10, "温柔了岁月"));
  date1.push(MM(78, "温柔"));
  while (!date1.empty())
  {
    cout << date1.top().getName() << date1.top().getAge(); //不使用运算符<<重载,可以在写一个访问的函数去调用他
    date1.pop();
  }
  system("pause");
  return 0;
}

自己通过仿函数写个比较的方法

#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
class MM
{
public:
  MM(){}
  MM(int age, string name): age(age), name(name){}
  int getAge() const { return age; }
  string getName() const { return name;}
private:
  int age;
  string name;
};
class compareName  //仿函数
{
public:
  bool operator() (const MM& object1, const MM& object2) const
  {
    return object1.getName() > object2.getName();
  }
};
int main()
{
  priority_queue<MM, vector<MM>, compareName> date1;
  date1.push(MM(10, "温柔了岁月"));
  date1.push(MM(18, "月"));
  while (!date1.empty())
  {
    cout << date1.top().getName() << " " <<  date1.top().getAge();
    date1.pop(); 
  }
}


相关文章
|
2月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
56 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
60 5
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
66 2
|
4月前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
8天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
132 77
|
17天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
1天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
10 2
实战~如何组织一个多容器项目docker-compose
|
10天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
44 3
|
17天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
50 7
|
17天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
27 5