20260408-入门班-栈与队列
已结束
IOI
开始于: 2026-4-13 15:30
4
小时
主持人:
26
栈与队列
栈(stack)是一种特殊的线性表,只能从一端进行插入或者删除操作。这一端被称为栈顶,另一端被称为栈底,栈的特点是后进先出(Last In First Out)
栈操作
stack<int> sta;//定义一个栈
sta.push(x);//向栈顶放入一个 x
cout<<sta.top();//查看栈顶
sta.pop();//丢出栈顶
cout<<sta.size();//查看栈的大小
cout<<sta.empty();//查看栈是否为空
//以上操作复杂度均为O(1)
使用数组模拟栈
int sta[1000],int top=0;
sta[++top]=x;//入栈
cout<<sta[top];//查看栈顶
z
top--;//出栈
cout<<top;//查看栈的大小
//以上操作复杂度均为O(1)
习题:
B.小鱼的数字
C.括号匹配问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
string s;
stack<char> sta;
cin>>s;
bool flag=1;//初始1:可以匹配 变成0 :不匹配
for(int j=0;j<s.length();j++){
if(s[j]=='('||s[j]=='['){
//直接入栈
}
else{
if(sta.size()!=0&&sta.top()=='('&&s[j]==')'||sta.size()!=0&&sta.top()=='['&&s[j]==']'){
//栈顶出栈
}
else{
//标记序列不匹配
}
}
}
if(sta.size()==0&&flag==1) cout<<"Yes\n";
else cout<<"No\n";
}
}
队列
queue
和栈不同,队列是只能从一端进入,从另一端出去的数据结构
队列操作
queue<int> que;//定义一个存储int类型的队列 名字叫 que
que.push(x);//在队列中加入一个数字
que.front();//返回队列最前面的数字
que.pop();//丢掉队列最前面的数字
que.size();//返回队列里的大小
que.empty();//返回布尔值,是否为空
//以上操作复杂度均为O(1)
除了只有一端能进入,一端能出去的队列,还有两端都能进出的队列
双端队列
deque
deque<int> dq;//定义
dq.push_back(x);//在队尾操作
dq.pop_back();
dq.push_front(x);//在队首操作
dq.pop_front();
dq.size();//查询队列大小
dq.empty();
//以上操作复杂度均为O(1)
习题
D.周末舞会
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int> a,b;
int n,m;cin>>n>>m;
int k;cin>>k;
for(int i=1;i<=n;i++){
a.push(i);
}
for(int j=1;j<=m;j++){
b.push(j);
}
for(int i=1;i<=k;i++){
int pa=a.front();
int pb=b.front();
cout<<pa<<" "<<pb<<"\n";
a.pop();
b.pop();
a.push(pa);
b.push(pb) ;
}
}
E.约瑟夫问题
优先队列
priority_queue
优先队列是一种特殊的队列,它的本质是一个大顶堆
priority_queue<int> que;
que.push(x);
que.top();
que.pop();
que.size();
习题
F.合并果子
- 状态
- 已结束
- 规则
- IOI
- 题目
- 5
- 开始于
- 2026-4-13 15:30
- 结束于
- 2026-4-13 19:30
- 持续时间
- 4 小时
- 主持人
- 参赛人数
- 26