数据结构练习专题
下面我给大家带来一些数据结构的题,供大家欣赏:
(一)栈
铁轨
试题描述:
某城市有一个火车站,铁轨铺设如图所示,有n节车厢从A方向驶入车站,按进站顺序编号为1至n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出车站。例如:出站顺序(5,4,1,2,3)是不可能的,而(5,4,3,2,1)是可能的。对于每节车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择A->C和C->B。
现在给你一种1到n的排列,请你判断是否是题目描述的一种可能,如果是请输出yes,否则输出no
输入:
两行,第一行有一个正整数n,表示有n节车厢,第二行有n个正整数,即1到n的一种排列,两两之间有一个空格分隔。
输出:
yes或者no
输入示例:
5
5 4 1 2 3
输出示例:
no
栈就好
#include <iostream> #include <stack> #include <cstdio> #include <cstring> #define MAXN 100 + 10 using namespace std; int a[MAXN],n; int main() { memset(a,66,sizeof(a)); stack<int> s; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int A=1,B=1; bool book=true; while(B<=n) { if(A==a[B]) { A++; B++; } else if(!s.empty() && s.top()==a[B]) { s.pop(); B++; } else if(A<=n) s.push(A++); else { book=false; break; } } if(book) printf("yes"); else printf("no"); //system("pause"); }
(优先队列)
阿格斯
试题描述:
你的任务是编写一个称为 Argus 的系统。该系统支持一个 Register 命令 Register Q_num Period,该命令注册了一个触发器,它每 Period 秒钟就会产生一次编号为 Q_nurn 的事件。你的任务是模拟出前k个事件。如果多个事件同时发生,先处理 Q_num 小的事件
输入:
前若干行是Register命令,以“#”结尾;最后一行是整数k。对于每条命令,1≤Q_num,Period≤3 000。k≤10 000。命令条数n不超过1 000。
输出:
输出k行,即前后个事件的Q_num
输入示例:
water 2 35
eat 1 76
drink 3 35
#
2
输出示例
2
3
#include <iostream> #include <queue> #include <cstdio> using namespace std; struct node { int num; int data; int tie; bool operator < (node a) const { if(a.tie==tie) return a.num < num; return a.tie < tie; } }; priority_queue <node> q; int main() { char c[10010]; while(cin>>c) { if(c[0]=='#') break; node a; scanf("%d%d",&a.num,&a.data); a.tie=a.data; q.push(a); } int k; cin>>k; for(int i=1;i<=k;i++) { node a; a.num=q.top().num; a.data=q.top().data; a.tie=q.top().tie+q.top().data; printf("%d\n",q.top().num); q.pop(); q.push(a); } }
数据结构结合:
试题描述:
你有一个类似“包包”的数据结构,支持两种操作,如下表所示。 1x:把元素x放进包包 2:从包包中拿出一个元素 给出一系列操作以及返回值,你的任务是猜猜这个“包包”到底是什么。它可能是一个栈<后进先出),队列(先进先出),优先队列(数值大的整数先出)或者其他什么奇怪的东西。
输入:
第一行为一个整数n(1≤n≤1 000)。以下n行每行要么是一条类型1的命令,要么是一条类型2的命令后面跟着一个整数x(1≤x≤100)。这个整数x表示执行完这条类型2的命令后,包包无错地返回了x。输入文件大小不超过1MB。
输出:
输出一行。一共有5种可能的输出。
stack:一定是一个栈
queue:一定是一个队列
priority queue:一定是一个优先队列
impossible:一定不是以上三种
not sure:至少有两种是可能的
输入示例:
5
1 5
1 3
1 2
2 2
2 3
输出示例:
stack
#include <iostream> #include <algorithm> #include <stack> #include <queue> using namespace std; queue <int> q; stack <int> s; priority_queue <int,vector<int>,less<int> > pq; int main() { int n; cin>>n; int qflag=1,sflag=1,pqflag=1; for(int i=1;i<=n;i++) { int a,b; scanf("%d%d",&a,&b); if(a==1) { q.push(b); s.push(b); pq.push(b); } if(a==2) { if(q.empty()) qflag=0; if(pq.empty()) pqflag=0; if(s.empty()) sflag=0; if(!q.empty() && q.front()!=b) qflag=0; else if(!q.empty()) q.pop(); if(!pq.empty() && pq.top()!=b) pqflag=0; else if(!pq.empty()) pq.pop(); if(!s.empty() && s.top()!=b) sflag=0; else if(!s.empty()) s.pop(); } } int ans=qflag+pqflag+sflag; if(ans>1) cout<<"not sure"; if(ans==1) { if(qflag==1) cout<<"queue"; if(pqflag==1) cout<<"priority queue"; if(sflag==1) cout<<"stack"; } if(ans==0) cout<<"impossible"; }