之前一直用纯C打代码,繁杂的调用指针、创建结构体来模拟栈和队列,不仅做题速度慢而且正确率也不高,需要频繁的对自己的代码进行验证,通过对于c++的学习知道了两种容器stack和queue,发现之前做过的题目得到很大程度上的简化,而且速度上也有很大的提高。下面我来简单的介绍这两种容器。
Stack 头文件:#include<stack> //先进后出型
定义方式:stack<变量类型> 变量名;
常用方法:stack<变量类型> s;
1.入栈:s.push(x); //:将x元素置于栈顶;
2.出栈:s.pop(); //弹出栈顶元素,并不会返回元素的值;
3.访问栈顶元素: s.top(); //返回栈顶元素值
4.判断栈空: s.empty(); //空返回true,反之返回false
5.栈中元素个数:s.size()
Queue 头文件:#include<queue> //先进先出型
定义方式:queue<变量类型,容器类型> 变量名;//容器类型默认为dqueue类型。
常用方法:queue<变量类型> q;
1.入队:如q.push(x) //:将x元素接到队列的末端;
2.出队:如q.pop() //弹出队列的第一个元素,并不会返回元素的值;
3,访问队首元素:如q.front()
4,访问队尾元素,如q.back();
5,访问队中的元素个数,如q.size();
6.判断队空:q.empty(); //空返回true,反之返回false
下面看一下我之前做过的两道题目,感觉确实有所提高
第一题:。
数据结构实验之栈与队列八:栈的基本操作
Problem Description
堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。
Input
首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入。
对于每组测试数据,第一行输入两个正整数 m(1 <= m <= 100)、n(1 <= n <= 1000),其中m代表当前栈的最大长度,n代表本组测试下面要输入的操作数。 而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示栈顶元素出栈;如果是'A',表示询问当前栈顶的值'。
Output
对于每组测试数据,根据其中的命令字符来处理堆栈;
(1)对所有的'P'操作,如果栈满输出'F',否则完成压栈操作;
(2)对所有的'A'操作,如果栈空,则输出'E',否则输出当时栈顶的值;
(3)对所有的'O'操作,如果栈空,则输出'E',否则输出栈顶元素的值,并让其出栈;
每个输出占据一行,每组测试数据(最后一组除外)完成后,输出一个空行。
Sample Input
2 5 10 A P 9 A P 6 P 3 P 10 P 8 A P 2 O 2 5 P 1 P 3 O P 5 A
Sample Output
E 9 8 F 8 3 5
站操作 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; int main(){ int num; cin>>num; while(num){ stack<int> S; int n,l; char c; cin>>n>>l; for(int i=0;i<l;i++){ cin>>c; if(c=='A'){ if(!S.empty()){ int x=S.top(); cout<<x<<endl; } else{ cout<<"E"<<endl; } } else if(c=='P'){ int x; cin>>x; if(S.size()>=n){ cout<<"F"<<endl; } else{ S.push(x); } } else if(c=='O'){ if(!S.empty()){ int x=S.top(); S.pop(); cout<<x<<endl; } else{ cout<<"E"<<endl; } } } if(num){ cout<<endl; } num--; } return 0; }
第二题:
数据结构实验之栈与队列十一:refresh的停车场
Problem Description
refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.
Input
输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。
Output
输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最先输出,无车辆不输出。
Sample Input
2 6 Add 18353364208 Add 18353365550 Add 18353365558 Add 18353365559 Del Out
Sample Output
18353365558 18353364208
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; int main(){ int v,n; while(cin>>v>>n){ int fag=0; stack<string> s; queue<string> q; string op; string num; for(int i=0;i<n;i++){ cin>>op; if(op[0]=='A'){ cin>>num; q.push(num); if(s.size()<v){ s.push(q.front()); q.pop(); } } else if(op[0]='O'){ if(q.empty()){ fag=1; } else{ q.pop(); } } else if(op[0]='D'){ if(s.empty()){ fag=1; } else{ s.pop(); if(!q.empty()){ s.push(q.front()); q.pop(); } } } } if(fag){ cout<<"Error"<<endl; } else{ while(!s.empty()){ cout<<s.top()<<endl; s.pop(); } } } return 0; }