C++ STL笔记

本文介绍了队列(先进先出FIFO)、栈(后进先出LIFO)、映射(map和multimap的区别)、集合(set和multiset)以及如何在实际问题中使用这些数据结构,如括号匹配、舞会配对和字典查询。
摘要由CSDN通过智能技术生成

1.queue

先进先出,First In First Out

queue<int> q;  //定义
push();  //添加元素
pop();  //从对头移除元素
back();  //获取最后一个元素
front();  //获取第一个元素
empty();  //判断队列是否为空
size();  //获取队列的大小

2.stack

先进后出,First In Last Out

stack<int> stk;  //定义
push();  //从栈顶添加元素
pop();  //从栈顶移除元素
top();  //获取栈顶元素
empty();  //判断栈是否为空
size();  //获取栈的大小

3.map,multimap

map是标准的关联式容器,map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。map底层的具体实现是采用红黑树变体的平衡二叉树的数据结构。在插入操作、删除和检索操作上比vector快很多。map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。 map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。

map<string,int> mp;  //定义
begin()  //返回指向头部的迭代器
clear()  //删除所有元素
count()  //获取指定元素出现的次数
empty()  //判断map是否为空
end()  //返回指向末尾的迭代器
erase()  //删除一个元素
find()  //查找一个元素
insert()  //插入元素
size()  //返回map中元素的个数

4.set,multiset

set:不允许键值重复

multiset:允许键值重复

set<int> st;  //定义
count()  //获取指定元素出现的次数
erase()  //删除一个元素
find()  //查找一个元素
clear()  //删除所有元素
empty()  //判断是否为空
insert()  //插入元素
size()  //返回元素的个数

5.vector

vector<int> v; //定义
size();  //返回元素的个数
empty();  //判断是否为空
front();  //返回第一个数据元素
back();  //返回最后一个数据元素
push_back(); //尾部插入元素
pop_back();  //删除最后一个元素
clear();  //删除容器中所有元素

题目

1.括号匹配(stack)

题目描述

假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配 

本题的任务是检验一个给定的表达式中的括号是否匹配正确 

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”

输入描述

一行字符,只含有圆括号和方括号,个数小于255

输出描述

匹配就输出一行文本“OK“,不匹配就输出一行文本”Wrong”

样例

输入

[(])

输出

Wrong
string s;
stack<int> q;
cin>>s;
for(int i=0;i<s.size();i++){
    if(s[i]=='('){
        q.push(1);
    }
    else if(s[i]==')'){
        if(q.empty()){
            cout<<"Wrong";
            return 0;
        )
        if(q.top()==1){
            q.pop();
        }
        else{
            q.push(2);
        }
    }
    //中括号同理
    else if(s[i]=='['){
        q.push(3);
    }
    else if(s[i]==']'){
        if(q.empty()){
            cout<<"Wrong";
            return 0;
        )
        if(q.top()==3){
            q.pop();
        }
        else{
            q.push(4);
        }
    }
}
if(!(q.empty())){
    cout<<"Wrong";
    return 0;
}
cout<<"OK";
return 0;

2.周末舞会(queue)

题目描述

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。(0<m,n,k<1000)

输入描述

第一行男士人数m和女士人数n;
第二行舞曲的数目k。

输出描述

共k行,每行两个数,表示配对舞伴的序号,男士在前,女士在后。

样例

输入

2 4
6

输出

1 1
2 2
1 3
2 4
1 1
2 2
queue<int>q1;
queue<int>q2;
int m,n,k,cnt1,cnt2;
cin>>m>>n>>k;
for(int i=1;i<=m;i++){
    q1.push(i);
}

q2同上操作

for(int i=1;i<=k;i++){
    int x=q1.front();
    int y=q2.front();
    cout<<x<<' '<<y<<endl;
    q1.pop();
    q2.pop();
    q1.push(x);
    q2.push(y);
    //每一次输出队头上的,然后把它扔队尾去
}
return 0;

3.查字典(map)

题目描述

顾名思义,查字典

输入描述

第一行一个整数N,表示字典中一共有多少单词(N<=10000)。 

接下来每两行表示一个单词,其中: 第一行是一个长度<=100的字符串,表示这个单词,全部小写字母,单词不会重复。 

第二行是一个整数,表示这个单词在字典中的页码。 

接下来一行是一个整数M,表示要查的单词数(M<=10000)。 

接下来M行,每行一个字符串,表示要查的单词,保证在字典中存在。

输出描述

M行,每行一个整数,表示第i个单词在字典中的页数。

样例

输入

2
scan
10
word
15
2
scan
word

输出

10
15
int n,m;
string s;
int x;
map<string,int>mp;
cin>>n;
for(int i=1;i<=n;i++){
    cin>>s;
    cin>>x;
    mp[s]=x;
}
cin>>m;
for(int i=1;i<=m;i++){
    cin>>s;
    cout<<mp[s]<<endl;
}
return 0;

4.集合的并

顾名思义

输入集合{a},{b}输出合并后的

set<int>a;
cin>>n>>m;
for(int i=1;i<=n;i++){
    cin>>x;
    a.insert(x);
)
for(int i=1;i<=m;i++){
    cin>>x;
    a.insert(x);
}
set<int>::iterator it;
for(it=a.begin();it!=a.end();it++){
    cout<<*it<<' '<<endl;
}
return 0;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值