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();
}
}