当前位置: 首页 > article >正文

STL容器篇之stack和queue

STL容器篇之stack

  • stack
    • 运用
    • 案例一:十进制变为二进制
    • 案例二:十进制转化为十六进制
      • char类型和int类型的转化
  • queue
    • queue(普通队列)
    • deque(双向队列)
    • priority_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(); 
	}
}

http://www.kler.cn/a/7206.html

相关文章:

  • MySQL技巧之跨服务器数据查询:基础篇-A数据库与B数据库查询合并--封装到存储过程中
  • 活着就好20241118
  • 串口DMA接收不定长数据
  • 力扣刷题日记之150.逆波兰表达式求值
  • Neo4j Desktop 和 Neo4j Community Edition 区别
  • React Native 全栈开发实战班 - 网络与数据之网络请求基础
  • 数学建模在大数据与数据挖掘、复杂网络与系统建模方面的应用
  • 如何让 a == 1 a == 2 a == 3 成立
  • iptables防火墙详解
  • Linux系统【Centos7】设置防火墙教程
  • record 替代 lombok, 我觉得不行
  • 58-Map和Set练习-LeetCode692前k个高频单词
  • AIGC之Stable Diffusion 提示词学徒库
  • 「ML 实践篇」回归系统:房价中位数预测
  • 使用机器学习opencv看手相
  • 嵌入式学深度学习:1、Pytorch框架搭建
  • 暴刷 SQL 导航
  • 探索五大机器学习技术及其应用
  • SSM整合
  • spring框架注解(纯注解)
  • c++类和对象
  • 通信协议-IIC协议
  • 政务服务一网通办建设方案(ppt)
  • 自己写gpt的软件教程-国内最好的chatgpt软件
  • 西北乱跑娃 -- 全栈开发新手必看客户端与服务的关系
  • 计算机网络 常见网卡信息