数据结构练习专题

下面我给大家带来一些数据结构的题,供大家欣赏:

(一)栈

铁轨

试题描述:

某城市有一个火车站,铁轨铺设如图所示,有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";
}

 

posted @ 2017-10-12 17:33  Dijkstra·Liu  阅读(1017)  评论(0编辑  收藏  举报