STL-stack和queue堆栈和队列
STL-stack和queue堆栈和队列
目录
堆栈和队列特性
stack为堆栈,比较简单, 内部元素都是需要 先进后出,也就是说只有栈顶的元素Top才可以被访问到
队列和栈一样,是一种线性结构,
1、先进先出
2、队尾添加,队首删除
队尾:允许被添加的一端,队首允许被删除的一端
入队,出队
堆栈主要操作
构造函数
#include<stack>
stack<int> st1;
stack<T> ST; // 支持其他格式
主要操作
- empty //是否为空
- size //大小
- push //入栈
- pop //出栈
栈顶插入和删除
"""栈顶"""
stack<int> st;
int item=st.top();
// 插入、删除
stack<float> st;
st.push(item);
st.pop();
大小相关
stack<char> st;
st.size();
st.empty();
简单案例
#include <iostream>
#include <stack>
using namespace std;
int main ()
{
stack< int > mystack;
for ( int i=0; i<5; ++i) mystack.push(i);
cout << "Popping out elements..." ;
while (!mystack.empty())
{
cout << " " << mystack.top();
mystack.pop();
}
cout << endl;
return 0;
}
队列的主要操作
构造函数
- empty //是否为空
- size //大小
- front //访问 队首数据
- back //访问 队尾数据
- push //入队
- pop //出队
#include <queue>
std::queue<int> myQueue;
// 队列
queue<int> q1;
queue<T> //这类适配器类都默认封装了一个 deque<T> 容器,也可以通过指定第二个模板类型参数来使用其他类型的容器
vector<int> v1 = {1,2,3,4,5};
// 1,2,3,4,5依此入栈
queue<int, vector<int>> q4(v1);
//底层容器必须提供这些操作:front()、back()、push_back()、pop_front()、empty() 和 size()。
//优先队列
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int>> q;
大小相关
queue<float> myQueue;
//是否为空,返回为ture,false;
myQueue.empty();
// 元素个数 获得元素个数
myQueue.size();
std::cout << "0. size: " << myQueue.size() << std::endl; // 输出:0
索引访问
#include <queue>
// 返回队首元素
queue<int> myqueue3;
myqueue3.push(77);
myqueue3.push(66);
//q.front(); //队首
int& a1 = myqueue3.front(); // 返回队首 77
int a2 = myqueue3.front(); // 返回队首 77
myqueue3.front() = 88; // 给头元素77赋值为88
cout << "front:" << myqueue3.front() << std::endl; // 输出:88
//返回队尾元素
//q.back(); //队尾
queue<int> myqueue4;
myqueue4.push(15);
myqueue4.push(22);
int& b1 = myqueue4.back(); // 22
int b2 = myqueue4.back(); // 22
myqueue4.back() = 33; // 给末尾元素22赋值为33
入队/出队
// q.push(x); //入队,将元素 x 从队尾插入(尾插法)
queue<int> q1;
q1.push(1); //入队
q1.push(2); //入队
// 添加一个元素(队尾添加)
//q1.pop(); //出队 删除对首元素,并返回其值
q.pop();
q.pop();
优先队列priority_queue
优先队列是一种会按照默认或自定义的优先级进行自动排序的队列,其特点是优先级高的元素排在队首.
priority_queue<Type, Container, Functional>
Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。
如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。
初始化构造
#include<queue>
//默认声明:
priority_queue<int> pq;
//以less为排列规则(大顶堆,表示顶堆元素比其他都大)
priority_queue<int,vector<int>,less<int> > pq;
//以greater为排列规则(小顶堆,表示顶堆元素比其他都小)
priority_queue<int,vector<int>,greater<int> > pq;
push(x) 将令 x 入队
top() 可以获得队首元素(即堆顶元素)
pop() 令队首元素(即堆顶元素)出队
empty() 检测优先队列是否为空,返回 true 则空,返回 false 则非空。
size() 返回优先队列内元素的个数
优先队列没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int> p;
p.push(1);
p.push(2);
p.push(8);
p.push(5);
p.push(43);
for(int i=0;i<5;i++){
cout<<p.top()<< " ";
p.pop();
}
return 0;
}
// 43 8 5 2 1 //默认是大顶堆
小顶堆
priority_queue<int, vector<int>, greater<int> > pq;
//其中,greater是STL内建的关系运算类函数对象(也就是仿函数),并且是一个二元运算符。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int>> q;
q.push(3);
q.push(4);
q.push(1);
for(int i=0;i<3;i++){
cout<<q.top()<< " ";
q.pop();
}
return 0;
}
// 1 3 4 //小顶堆
自定义结构体排序
#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct fruit
{
string name;
int price;
} f1, f2, f3;
struct cmp
{
bool operator()(fruit fl, fruit f2)
{
return f1.price > f2.price; // 降序
}
};
int main()
{
priority_queue<fruit, vector<fruit>, cmp> q;
f1.name = "apple";
f1.price = 3;
f2.name = "melon";
f2.price = 4;
f3.name = "banana";
f3.price = 1;
q.push(f1);
q.push(f2);
q.push(f3);
cout << q.top().name << " " << q.top().price << endl;
return 0;
}