IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 浅整理一下STL(顺序式容器)vector、stack、queue、priority_queue、list -> 正文阅读

[数据结构与算法]浅整理一下STL(顺序式容器)vector、stack、queue、priority_queue、list

顺序式容器:

关于vector的简单用法:

头文件:<vector>

1.vector动态数组,从末尾能快速插入与删除,直接访问任何元素。

2.vector能用来存放任何类型的对象:

??Int:vector<int>a;//默认初始值,a为空

????? vector<int>b(a);//用a定义b

????? vector<int>a(100);//有100个值为0的元素

????? vector<int>a(100,6);// 有100个值为6的元素

??String:vector<string>a(100,”hello”);//100个值为hello的元素

???????? vector<string>b(a.begin,a.end);//b是a的复制

??Struct:struct point{int x;int y;}; ?vector<struct>a;//用a来存坐标

3.vector的常用操作:

赋值:a.push_back(100);//在尾部添加元素100

????? a.insert(a.end(),10,5);//在尾部插入10个值为5的元素

元素个数:int size=a.size();

删除:a.pop_back();//删除末尾元素

? ????a.erase(a.begin()+2);//删除第三个元素

????? a.erase(a.begin()+i,a.begin()+j);//删除区间[i,j-1]的元素

打印:cout<<a[0]<<endl;

排序:sort(a.begin(),a.end());//默认从小到大

清空:a.clear();

a.back();//返回末尾元素

4.例题:

代码:

#include<bits/stdc++.h>

#include<vector>

using namespace std;

int main()

{

????? vector<int>table;//模拟圆桌

????? int n,m;

????? while(cin>>n>>m)

????? {

??????????? table.clear();

??????????? for(int i=0;i<2*n;i++) table.push_back(i);//初始化

??????????? int pos=0;//记录当前位置

??????????? for(int i=0;i<n;i++)//赶走n个人

??????????? {

??????????? ????? pos=(pos+m-1)%table.size();//圆桌是一个环,取余处理

????????????????? table.erase(table.begin()+pos);//赶走坏人,table的数量也相应动态减少

??????????? }

??????????? int j=0;

??????????? for(int i=0;i<2*n;i++)

??????????? {

????????????????? if(i%50==0&&i!=0) cout<<endl;//五十一行

????????????????? if(j<table.size()&&i==table[j])//留下来的都是好人

????????????????? {

?????????????????????? j++;

?????????????????????? cout<<"G";

????????????????? }

????????????????? else cout<<"B";

??????????? }

??????????? cout<<endl;

????? }

????? return 0;

}

关于stack的用法:

头文件<stack>

1.stack特点:先进后出

2.stack有关操作:

??Stack<Type>s; //定义栈,Type为数据类型,,可以为int、float、char

??s.push(i);//把i放到栈顶

??s.top();//返回栈顶元素,但不删除

??s.pop();//删除栈顶元素,但不返回

??????? //出栈的时候有两个操作:top()获得栈顶元素,再pop()删除栈顶元素

??s.size();//返回栈中元素个数

??s.empty();//检查栈是否为空,空返回true,否则返回false

3.例题:

输入:”olleh !dlrow”?? 输出:“hello world!”

代码:

int main()

{

????? int n;

????? char ch;

????? cin>>n;

????? getchar();

????? while(n--)

????? {

??????????? stack<char>s;

??????????? while(true)

??????????? {

????????????????? ch=getchar();

????????????????? if(ch==' '||ch=='\n'||ch==EOF)

????????????????? {

?????????????????????? while(!s.empty())

?????????????????????? {

???????????????????????????? cout<<s.top();

???????????????????????????? s.pop();

?????????????????????? }????

?????????????????????? if(ch=='\n'||ch==EOF)

???????????????????????????? break;??????????????

?????????????????????? cout<<" ";

????????????????? }

????????????????? else s.push(ch);

??????????? }

??????????? cout<<endl;

????? }

??? return 0;

}

关于queue的用法:

头文件<queue>

1.队列的特点:先进先出

2.队列的基本操作:

queue<type>q;//定义队列,type为类型int、char、float

q.push(item);//把item放到队尾中

q.front();//返回队首元素,但不删除

q.pop();//删除队首元素,但不返回

q.back();//返回队尾元素

q.size();//返回元素个数

q.empty();//检查队列是否为空

3.例题:

输入:1 abcd输出:abcd

代码:

int main()

{

????? char ch;

????? int n;

????? cin>>n;

????? queue<char>q;

????? getchar();

????? while(n--)

????? {

??????????? while(true)

??????????? {

????????????????? ch=getchar();

????????????????? if(ch=='\n'||ch==EOF)

????????????????? {

?????????????????????? while(!q.empty())

?????????????????????? {

???????????????????????????? cout<<q.front();

???????????????????????????? q.pop();

?????????????????????? }

?????????????????????? break;

????????????????? }

????????????????? else q.push(ch);???

??????????? }

??????????? cout<<endl;

????? }

??? return 0;

}

关于优先队列的用法:

头文件<queue>

1.优先队列的基本操作:

priority_queue<type>q;//type为类型

q.top();//返回优先队列的队首元素,但不删除

q.pop();//删除优先队列的队首元素,但不返回

q.push(i);//将i插入优先队列的队尾

2.int类型的默认优先为:从大到小

如图:

3.struct类型:

例题:医院有三个医生,医生根据病人的病情和看病时间看病,病人权值1~10,10病最重,

权值大的先看病,在权值相同的时候,谁先来给谁看。

输入:7???????????????????? 输出:

In 1 1??????????????????????? 2

In 1 2??????????????????????? empty

Out 1??????????????????????? 3

Out 2??????????????????????? 1

In 2 1

Out 2

Out 1

代码:

struct patient

{

????? int id;

????? int val;

}pat;

bool operator<(patient a,patient b)

{

???? if(a.val==b.val) return a.id>b.id;

???? else return a.val<b.val;

}//当做优先队列的特殊排序

int main()

{

????? priority_queue<patient>q[5];

????? int n,tem=0;

????? cin>>n;

????? string s;

????? while(n--)

????? {

??????????? cin>>s;

??????????? if(s[0]=='I')

??????????? {

????????????????? int d,rank;

????????????????? cin>>d>>rank;

????????????????? pat.id=++tem;

????????????????? pat.val=rank;

????????????????? q[d].push(pat);

??????????? }

??????????? else

??????????? {

????????????????? int d;

????????????????? cin>>d;

????????????????? if(!q[d].empty())

????????????????? {

?????????????????????? cout<<q[d].top().id;

?????????????????????? q[d].pop();

????????????????? }

????????????????? else cout<<"Empty";

????????????????? cout<<endl;

??????????? }

????? }

??? return 0;

}

关于list的用法:

1.链表与队列的区别:

队列插入删除操作少,一般只在队首或者队尾插入或删除,随机访问较多。

链表插入删除操作多,随机访问少

2.例题

输入:2??????????????????????? 输出:

20?????????????????? ???????????????1 7 19

40????????????????????????????????? 1 19 37

代码:

int main(){

????? int t,n;

????? cin>>t;

????? while(t--)

????? {

??????????? cin>>n;

??????????? int k=2;

??????????? list<int>l;

??????????? list<int>::iterator? it;//迭代器it的大小一直在变;

??????????? for(int i=1;i<=n;i++) l.push_back(i);

??????????? while(l.size()>3)

??????????? {

????????????????? int num=1;

????????????????? for(it=l.begin();it!=l.end();)

????????????????? {

?????????????????????? if(num++%k==0) it=l.erase(it);

?????????????????????? else it++;

????????????????? }

????????????????? k==2?k=3:k=2;

??????????? }

??????????? for(it=l.begin();it!=l.end();it++){

????????????????? if(it!=l.begin()) cout<<" ";

????????????????? cout<<*it;

??????????? }

??????????? cout<<endl;

????? }

??? return 0;

}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:39:43  更:2022-03-03 16:44:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:44:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码