• 双端队列篇deque SDUT OJ 双向队列


    双向队列

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

          想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
    现在给你一系列的操作,请输出最后队列的状态;
    命令格式:
    LIN X  X表示一个整数,命令代表左边进队操作;
    RIN X  表示右边进队操作;
    ROUT
    LOUT   表示出队操作;

    输入

    第一行包含一个整数M(M<=10000),表示有M个操作;
    以下M行每行包含一条命令;
    命令可能不合法,对于不合法的命令,请在输出中处理;

    输出

    输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
    以下若干行处理不合法的命令(如果存在);
    对于不合法的命令,请输出一行X ERROR
    其中X表示是第几条命令;

    示例输入

    8
    LIN 5
    RIN 6
    LIN 3
    LOUT
    ROUT
    ROUT
    ROUT
    LIN 3

    示例输出

    3
    7 ERROR

    双端队列的典型操作模拟题!一开始读错题了,WA一次!
    注意:先输出处理完这m条命令后 队列里还有什么数据, 然后再依次输出报错的指令信息!
    #include <iostream>
    #include <string>
    #include <stdio.h>
    #include <string.h>
    #include <map>
    #include <stack>
    #include <deque> //双端队列
    #include <algorithm>
    #include <ctype.h>
    
    using namespace std;
    
    
    int a[20000], e;
    
    int main()
    {
        int m;
        cin>>m;
        int i, j, dd;
        string s;
        deque<int>q;
        deque<int>::iterator it;
    
        for(i=1; i<=m; i++)
        {
            cin>>s;
            if(s=="LIN")
            {
                cin>>dd;
                q.push_front(dd);
            }
            else if(s=="RIN")
            {
                cin>>dd;
                q.push_back(dd);
            }
            else if(s=="LOUT")
            {
                if(q.empty())
                {
                    a[e++]=i;
                }
                else
                {
                    q.pop_front();
                }
            }
            else if(s=="ROUT")
            {
                if(q.empty())
                {
                    a[e++]=i;
                }
                else
                {
                    q.pop_back();
                }
            }
        }
    
        int flag=0;
        for(it=q.begin(); it!=q.end(); it++)
        {
            if(flag==0)
            {
                printf("%d", *it );
                flag=1;
            }
            else if(flag==1)
            {
                printf(" %d", *it );
            }
        }
    
        if(flag==1)
        {
            printf("
    ");  //如果flag==1 就表示最后状态的队列里还有数据,输出完这些数据后就要输出换行! 如果flag==0, 则没有必要换行了!
        }
        for(j=0; j<e; j++)
        {
            printf("%d ERROR
    ", a[j] );
        }
        return 0;
    }
    
     
  • 相关阅读:
    互联网产品经理入门知识
    ceph的架构和概念学习
    使用cephadm安装ceph octopus
    split命令,文件切割
    openssh升级到8.4版本
    Shell写一个显示目录结构
    nsenter 工具的使用
    『Spring Boot 2.4新特性』减少95%内存占用
    Dubbo 一篇文章就够了:从入门到实战
    for update 和 rowid 的区别
  • 原文地址:https://www.cnblogs.com/yspworld/p/4079827.html
Copyright © 2020-2023  润新知