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

参考资料

https://blog.csdn.net/dark_cy/article/details/83827622

https://blog.csdn.net/m0_38059875/article/details/105602271

posted @ 2024-01-22 19:59  贝壳里的星海  阅读(5)  评论(0编辑  收藏  举报