【C++】STL容器整理合集(上)

26 篇文章 13 订阅
5 篇文章 0 订阅
本文详细介绍了C++中的STL容器,包括栈的入栈、出栈等操作,队列的定义与操作,vector的一维和二维数组定义,以及deque的基本操作。文章提供了示例代码和训练题目,帮助读者理解和应用这些数据结构。
摘要由CSDN通过智能技术生成

目录

一·stack(栈)

STL模板 

1.入栈操作

2.出栈操作

3.返回栈顶元素

4.求该栈的长度

5.栈是否为空

训练题目

题目描述

输入格式

输出格式

输入输出样例

说明/提示

二.queue(队列)

STL容器

定义队列

队列操作

训练题目

参考代码

三.vector(不定长数组)

STL容器

二维vector的定义

四.deque(双端队列)

STL容器


根据前面我所讲的一些STL容器,今天我专门整理出来了一系列的STL合集,大佬们请查收

一·stack(栈)

栈这个知识点在我前面的博文里专门提到过 

详见:栈浅谈(上)_程序猿的逆袭之路的博客-CSDN博客

今天我们来梳理一下栈的STL容器。

首先我们要定义栈

#include<stack>//头文件,当然也可以写万能头
stack<int>s1;//入栈元素为 int 型
stack<string>s2;//入队元素为string型
stack<node>s3;//入队元素为自定义型

STL模板 

接下来是栈的一些操作

1.入栈操作

push(x);//将x加入栈中,即入栈操作

2.出栈操作

pop();//出栈操作(删除栈顶),只是出栈,没有返回值

3.返回栈顶元素

top();//返回第一个元素(栈顶元素)

4.求该栈的长度

size();//返回栈中的元素个数

5.栈是否为空

empty();//当栈为空时,返回 true

训练题目

详见:表达式括号匹配 - 洛谷

题目描述

假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255255,左圆括号少于 2020 个。

输入格式

一行:表达式。

输出格式

一行:YES 或 NO

输入输出样例

输入 #1

2*(x+y)/(1-x)@

输出 #1

YES

输入 #2

(25+x)*(a*(a+b+b)@

输出 #2

NO

说明/提示

表达式长度小于 255255,左圆括号少于 2020 个。

参考代码:

​#include<iostream>
#include<stack>
#define llu unsigned long long
stack<char>s;
using namespace std;
int main(){
    ios::sync_with_stdio(false);
	char s1[105];
	while(cin>>s1&&s1!=0){
		int n=strlen(s1);
		for(int i=0;i<n;i++){
			if(s1[i]=='('||s1[i]=='['||s1[i]=='{') s.push(s1[i]);
			else if(s1[i]==')'||s1[i]==']'||s1[i]=='}'){
				if(s.empty())s.push(s1[i]);
				else if(s1[i]==')'&&s.top()=='(') s.pop();
				else if(s1[i]==']'&&s.top()=='[') s.pop();
				else if(s1[i]=='}'&&s.top()=='{') s.pop();
				else s.push(s1[i]);
			}
		}
		if(s.empty())cout<<"yes"<<endl ;
		else cout<<"no"<<endl;
	}
	return 0;
}

二.queue(队列)

队列之前我们也有一篇专门的博客讲过

详见:队列浅谈(超全)_程序猿的逆袭之路的博客-CSDN博客

STL容器

定义队列

queue<数据类型> q;
queue<int> q;
queue<char> q;
queue<double> q;

队列操作

和栈一样,队列同样可以判断队列是否为空:

q.empty(); //队列是否为空 空就是1 不是空就0 

获取队列的长度:

q.size(); // 获取队列当前长度

入队与出队:

q.push(x);// x是入队元素
q.pop();   //出队

获取队首元素和获取队尾元素如下:

q.front(); //获取队首元素 可以输出 
q.back();  //获取队尾元素 可以输出

获取当前队列的长度:

q.size();  //获取队列当前长度

其实队列STL容器中也有相对应的函数原型,除了q.push()是有返回值类型除外,其他函数都是void类型的。

训练题目

题目描述
n 个人围成一圈,从第一个人开始报数,数到 m的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n − 1  名小朋友,而该题是全部出圈。
 

输入格式
输入两个整数 n , m。

输出格式
输出一行 n个整数,按顺序输出每个出圈人的编号。

样例 #1
样例输入 #1
10 3
样例输出 #1
3 6 9 2 7 1 8 5 10 4
提示
1 ≤ m , n ≤ 100

参考代码

#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int n,cnt=1,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		q.push(i);
	}
	while(q.size()!=1){
		if(cnt%m==0){
		    cout<<q.front()<<" ";
			q.pop();
		}else{
			q.push(q.front());
			q.pop();
		}
		cnt++;
	}
	cout<<q.front();
	return 0;
}

三.vector(不定长数组)

STL容器

首先我们先要定义一个vector

vector<int>v;//定义一个一维不定长数组

接下来是vector里面的容器

vector<int> v
v.clear()            //移除容器中所有数据。
v.empty()            //判断容器是否为空。
v.erase(pos)         //删除pos位置的数据
v.erase(beg,end)     //删除[beg,end)区间的数据
v.front()            //传回第一个数据。
v.insert(pos,elem)   //在pos位置插入一个elem拷贝
v.pop_back()         //删除最后一个数据。
v.push_back(elem)    //在尾部加入一个数据。
v.resize(num)        //重新设置该容器的大小
v.size()             //回容器中实际数据的个数。
v.begin()            //返回指向容器第一个元素的迭代器
v.end()              //返回指向容器最后一个元素的迭代器
 

二维vector的定义

二维定义vector的方法一般有两种

//方法一:    
int N=5,M=6; 
vector<vector<int>>obj(N);              //定义二维动态数组大小5行 
for(int i=0;i<obj.size();i++)        //动态二维数组为5行6列,值全为0  
    obj[i].resize(M); 
//方法二:
vector<vector<int>>obj2(N,vector<int>(M));   //定义二维动态数组5行6列

四.deque(双端队列)

STL容器

push_back();//在队尾压入元素
push_front();//在队首压入元素
pop_back();//删除最后一个元素
pop_front();//删除第一个元素
front();//返回第一个元素的引用
back();//返回第二个元素的引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqbzcyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值