• 数据结构练习专题


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

    (一)栈

    铁轨

    试题描述:

    某城市有一个火车站,铁轨铺设如图所示,有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
    ",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";
    }
  • 相关阅读:
    CodeForces
    HihoCoder
    HihoCoder
    CodeForces
    CodeForces
    CodeForces
    HihoCoder
    HihoCoder
    CodeForces
    HihoCoder
  • 原文地址:https://www.cnblogs.com/jason2003/p/7657241.html
Copyright © 2020-2023  润新知