河北大学程序设计训练营
[TOC]
stack
称为栈(或者堆栈),堆栈是一个不容忽视的概念。堆栈都是一种数据项按序排列的数据结构,只能在一端(   称为栈顶(top) )对数据项进行插入和删除.
特点:   先进后出
头文件
增加元素
删除元素
返回栈中元素数目
返回栈顶元素
判断是否为空
练习
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | #include<iostream>#include<string>
 #include<stack>
 using namespace std;
 
 int main(){
 stack<int> s;
 int n = 10;
 
 while(n--){
 s.push(n);
 }
 while(s.size()!=0){
 cout << s.top() << ",";
 s.pop();
 }
 }
 
 | 
stack 括号匹配
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 
 | #include<iostream>#include<string>
 #include<stack>
 using namespace std;
 
 int main(){
 int T;
 string str;
 
 cin >> T;
 
 while(T--){
 
 stack<char> s;
 cin >> str;
 int flag = 1;
 
 for(int i=0; i < str.length(); ++i){
 
 if( str[i]=='(' || str[i]=='[' ||
 str[i]=='{' ) {
 s.push(str[i]);
 
 } else {
 
 if(!s.empty()){
 if( (s.top()=='(' && str[i]==')') ||
 (s.top()=='{' && str[i]=='}') ||
 (s.top()=='[' && str[i]==']') ) {
 s.pop();
 } else{
 flag = 0;
 break;
 }
 } else{
 flag = 0;
 break;
 }
 
 }
 }
 
 
 if(flag==0){
 cout << "No" << endl;
 } else {
 
 if(s.size()==0){
 cout << "Yes" << endl;
 } else{
 cout << "No" << endl;
 }
 }
 
 
 }
 
 }
 
 | 
queue
队列是一种特殊的 线性表 ,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
特点:  先进先出
头文件
增加元素
删除
获取第一个元素
| 1
 | front():返回 queue 中第一个元素的引用
 | 
获取最后一个元素
| 1
 | back():返回 queue 中最后一个元素的引用
 | 
练习
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | #include<iostream>#include<queue>
 using namespace std;
 
 int main(){
 
 queue<int> q;
 for(int i=0; i < 10 ; ++i){
 q.push(i);
 }
 cout << "队列内元素数: " << q.size() << endl;
 cout << "现在的头和尾: "<< q.front() << " " << q.back() << endl;
 
 q.pop();
 cout << "队列内元素数: " << q.size() << endl;
 cout << "pop后的头和尾:"<< q.front() << " " << q.back() << endl;
 
 
 }
 
 | 
例题:
队列queue Pro 银行业务队列简单模拟
这个题比较简单不再做讲解
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 
 | #include<iostream>#include<queue>
 using namespace std;
 
 int main(){
 
 queue<int> qA,qB;
 int n,id,count1,count2;
 cin >> n;
 count1 = n;
 count2 = n;
 
 while(count1--){
 cin >> id;
 if(id%2==1) qA.push(id);
 else qB.push(id);
 }
 
 while( count2 ){
 if(!qA.empty()){
 cout << qA.front();
 qA.pop();
 count2--;
 if(n-count2!=n) cout << " ";
 }
 
 if(!qA.empty()){
 cout << qA.front();
 qA.pop();
 count2--;
 if(n-count2!=n) cout << " ";
 }
 
 if(!qB.empty()){
 cout << qB.front();
 qB.pop();
 count2--;
 if(n-count2!=n) cout << " ";
 }
 }
 
 
 }
 
 | 
队列 queue 无聊的队列
因为1000ms的限时,故正常的反转操作都无法通过时间。
所以这里可以使用双端队列。
双端队列做法
https://blog.csdn.net/qq_45475271/article/details/107420369
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | #include<bits/stdc++.h>using namespace std;
 deque<int> dq;
 int main(){
 
 int qwq,n,x,flag=0;
 cin >> qwq;
 while(qwq--){
 scanf("%d",&n);
 if(n==1){
 scanf("%d",&x);
 !flag ? dq.push_back(x):dq.push_front(x);
 }else if(n==2){
 if(!dq.empty()) !flag ? dq.pop_front():dq.pop_back();
 }else{
 flag = !flag;
 }
 cout << ((dq.empty())?-1:(dq.front()^dq.back())) << endl;
 }
 return 0;
 }
 
 | 
模拟队列做法
牺牲空间的模拟队列做法
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 
 | #include <iostream>
 using namespace std;
 
 const int N = 8e5+10;
 int q[N];
 int head = N >> 1, tail = head - 1,flag = 1;
 
 bool empty()
 {
 if(flag == 1 && tail >= head ) return 0;
 if(flag == -1 && head >= tail ) return 0;
 return 1;
 }
 int main()
 {
 int n;
 
 cin >> n;
 while(n --)
 {
 int choice;
 scanf("%d",&choice);
 if( choice == 1)
 {
 int x;
 scanf("%d",&x);
 tail = tail + flag;
 q[tail] = x;
 }
 else if( choice == 2 && !empty() ) head += flag;
 else {
 swap(head,tail);
 flag = -flag;
 }
 
 if(!empty()) printf("%d\n",q[head] ^ q[tail]);
 else printf("-1\n");
 }
 
 }
 
 |