알고리즘 대회에서 일반적으로 사용되는 STL 라이브러리

스택

개념: 상자처럼 들어가려면 상단이 먼저 나갈 때까지 기다려야 합니다. 즉, "선입, 후출"입니다.
여기에 이미지 설명 삽입

스택에는 종종 위의 네 가지 기능이 있으며, 다음으로 이 네 가지 기능을 이해하기 위해 스택을 작성합니다.

모의 스택 구현:

#include<iostream>
#include<string>

using namespace std;

const int N = 100010;

int stk[N], tt; //tt为栈顶指针,初始化为0 

int main(){
    
    
	int n; //要进行几次操作 
	cin >> n;
	string op; //要进行的操作
	
	while (n --){
    
    
		cin >> op;
		if (op == "push"){
    
    
			int x; //需要入栈的数 
			cin >> x;
			stk[++ tt] = x;  
		}
		else if (op == "pop") tt --;
		else if (op == "empty") cout << (tt ? "NO" : "YES") << endl;
		else cout << stk[tt] << endl;
	} 
	
	return 0;
} 

시뮬레이션된 스택의 구현은 스택 상단 포인터 tt만 제어하면 됩니다.

스택의 맨 위 요소에 액세스하려면 tt가 가리키는 위치에 있는 요소에만 액세스하면 됩니다.

스택에 요소를 추가하려면 다음 위치를 가리키도록 tt에 1을 추가한 다음 해당 위치에 숫자를 저장합니다.

스택의 맨 위 요소를 삭제하려면 tt를 1씩만 감소시키면 되며 이 요소는 더 이상 스택의 맨 위 요소가 아니므로 스택에서 제거됩니다.

스택이 비어 있는지 여부를 판단하려면 tt가 0인지 여부만 확인하면 됩니다.

물론 게임 내에서 STL 라이브러리를 직접 호출할 수 있습니다.

#include<stack> //头文件

stack<int> s; //定义一个栈

s.size(); //栈中元素的数量 

s.empty(); //栈是否为空 

s.push(); //将此元素压入栈 

s.pop(); //弹出栈顶元素
 
s.top(); //访问栈顶元素 

대기줄

개념: 줄을 서는 것과 같이 먼저 온 사람은 앞에 있고 나중에 온 사람은 줄 끝에만 있을 수 있습니다 먼저 온 사람은 먼저 가고 나중에 온 사람은 뒤로만 갈 수 있습니다 , "선입 선출".
여기에 이미지 설명 삽입
큐에는 위의 네 가지 기능이 있는 경우가 많으므로 이 네 가지 기능을 구현하기 위해 큐를 작성하여 이해해 봅시다.

#include<iostream>
#include<string>

using namespace std;

const int N = 100010;

int q[N];
int hh, tt = -1; //hh为队头,tt为队尾 

int main(){
    
    
	int n; //要进行的操作数 
	cin >> n;
	
	while (n --){
    
    
		string op;
		cin >> op; //要进行的操作
		if (op == "push"){
    
    
			int x; //要加入的数 
			cin >> x;
			q[++ tt] = x; 
		}
		else if (op == "pop") hh ++;
		else if (op == "empty") cout << (hh <= tt ? "NO" : "YES") << endl;
		else cout << q[hh] << endl; 
	}
	
	return 0;
}

시뮬레이트된 큐의 구현은 큐 헤드 hh와 큐 테일 tt만 제어하면 됩니다.

큐의 맨 앞에 있는 요소를 쿼리하려면 hh가 가리키는 위치의 값만 확인하면 됩니다.

요소를 추가하려면 tt에 1을 더하고 다음 위치를 가리키고 이 위치에 숫자를 저장하면 됩니다.

요소를 삭제하려면 hh에 1을 추가하고 그가 다음 요소를 가리키도록 하면 요소가 삭제됩니다.

큐가 비어 있는지 판단하려면 큐의 헤드가 큐의 테일보다 큰지 여부만 확인하면 됩니다. 대기열의 끝보다 크면 비어 있고 그렇지 않으면 비어 있지 않습니다.

다음으로 STL 라이브러리의 큐 메서드를 살펴봅니다.

#include<queue>

queue<int> q; //定义一个队列

que.size(); //返回队列元素数量

que.empty(); //返回队列是否为空

que.push(); //加入队列

que.pop(); //出队

que.front(); //返回队首

que.back(); //返回队尾 

래더 경쟁에서 L2 난이도에 대한 실제 질문을 살펴보겠습니다.

자동 포장기의 구조는 그림 1과 같습니다. 먼저 기계에 N 개의 트랙이 있고 일부 항목이 배치됩니다. 트랙 아래에 바구니가 있습니다. 트랙의 버튼을 누르면 피스톤이 왼쪽으로 밀려 트랙 끝에 있는 항목을 바구니 밖으로 밀어냅니다. 0번 버튼을 누르면 로봇이 바구니 위에서 물건을 집어서 줄 위에 놓습니다. 그림 2는 버튼 3, 2, 3, 0, 1, 2, 0을 차례로 누른 후 포장기의 상태를 보여줍니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
특별한 경우는 바구니의 용량이 제한되어 있기 때문에 바구니가 가득 찼지만 여전히 트랙 버튼이 눌려 있을 때 시스템이 키 0을 강제로 활성화하여 바구니에서 항목을 먼저 잡은 다음 버튼을 눌러야 합니다. 트랙에 해당하는 항목을 아래로 내립니다. 또한 트랙이 이미 비어 있는 경우 해당 버튼을 눌러도 아무 작업도 수행되지 않으며 마찬가지로 바구니가 비어 있는 경우 0번 버튼을 눌러도 아무 작업도 수행되지 않습니다.
이제 일련의 버튼 작업이 주어지면 파이프라인의 항목을 차례로 나열하십시오.
여기에 이미지 설명 삽입

분석하다

주제 분석을 통해 우리는 트랙을 대기열로, 프레임을 대기열로 간주하고 이 프로세스를 시뮬레이션하기만 하면 된다는 것을 발견했습니다.

코드

#include<iostream>
#include<queue>
#include<stack>

using namespace std;

const int N = 110;

queue<char> q[N]; //轨道
stack<char> s; //筐
int n, m, smax;

int main(){
    
    
	cin >> n >> m >> smax;
	for (int i = 1; i <= n; i ++) 
		for (int j = 0; j < m; j ++){
    
    
			char c;
			cin >> c;
			q[i].push(c);
		}
		
	int x;
	while (cin >> x, x != -1){
    
    
		if (x == 0 && !s.empty()){
    
     //注意需要判断一下是否为空,如果在为空状态下访问栈顶元素会报错
			cout << s.top();
			s.pop();
		}
		if (x > 0 && s.size() < smax && q[x].size()){
    
    
			s.push(q[x].front());
			q[x].pop();
		}
		else if (x > 0 && s.size() >= smax && q[x].size()){
    
    
			cout << s.top();
			s.pop();
			s.push(q[x].front());
			q[x].pop();
		}
	}
	
	return 0;
}

벡터

개념: 가변 길이의 배열과 마찬가지로 배열로 취급할 수 있습니다.

STL 라이브러리:

#include<vector>

vector<int> v; //定义一个vector

v.push_back(item); //向v后加一个元素

v.pop_back(); //删除v最后一个元素

v.size(); //获取v中元素个数

v.empty(); //判断v是否为空

v.clear(); //清空v中的元素

v[index]; //获取v中下标为index的元素O(1)

v.begin(); //返回指向第一个元素的迭代器

v.end(); //返回指向vector末尾(最后一个元素之后的那个位置)的迭代器

v.front(); //返回第一个元素

v.back(); //返回最后一个元素

세트

개념: 동일한 요소를 중복 제거하고 기본적으로 정렬하는 수학 모음과 같습니다.

STL 라이브러리:

#include<set>

set<int>s; //定义一个set

s.insert(); //插入一个元素 

s.size(); //获取元素的个数

s.empty(); //判断是否为空

s.clear(); //清空s

s.count(item); //返回s中item的数量,因为集合中的元素不能重复,因此只能返回0或1 

지도

개념: 맵은 매핑 관계인 키-값 쌍입니다.패키지된 해시 테이블로 이해하고 키를 통해 값에 액세스할 수 있습니다.

STL 라이브러리:

#include<map>

map<int,int> mp; //定义一个map

mp.size(); //获取元素个数

mp.empty(); //判断是否为空

mp.clear(); //清空mp

mp[key]=tmp; //可以把键值对key—value中的value赋值为tmp,如果没有对应的键值对,则将该键值对插入到map中

추천

출처blog.csdn.net/weixin_51711289/article/details/129752549