双向队列 SDUT-1466

双向队列

题目:

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


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


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


Sample Input

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


Sample Output

3
7 ERROR


题解:

主要是STL:deque的使用;
deque:双队列,在对头队尾都可以插入删除元素。

deque que;//定义了一个整型的双端队列;

基本操作:
  que.assign(beg,end) 将[beg; end)区间中的数据赋值给que。
  que.assign(n,elem) 将n个elem的拷贝赋值给que。
  que. at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
  que.back() 返回容器que的最后一个元素的引用。如果que为空,则该操作未定义。
  que.begin() 传回迭代器中的第一个数据地址。
  que.clear() 移除容器中所有数据。
   que.empty() 判断容器是否为空。
   que.end() 返回一个迭代器,它指向容器que的最后一个元素的下一位置。
   que.erase(pos) 删除pos位置的数据,传回下一个数据的位置。
  que.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
   que.front() 返回容器que的第一个元素的引用。如果que为空,则该操作为空。
   que.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
  que.insert(pos,n,elem) 在pos(迭代器)位置插入>n个elem数据。无返回值
   que.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值
  que.max_size() 返回容器que可容纳的最多元素个数。
   que.pop_back() 删除最后一个数据。
   que.pop_front() 删除头部数据。
  que.push_back(elem) 在尾部加入一个数据。
  que.push_front(elem) 在头部插入一个数据。
  que.rbegin() 返回一个逆序迭代器,它指向容器que的最后一个元素。
   que.rend() 返回一个逆序迭代器,它指向容器que的第一个元素的前一个位置。
  que.resize(num) 重新指定队列的长度。
  que.size() 返回容器中实际数据的个数。
   que.swap(que2) 交换容器que和que2中的所有元素。
   swap(que1,que2) 交换容器que1和que2中的所有元素。


AC代码:

#include

using namespace std;

int main(){
    deque<int> que;
    int t[10000] = {0};

    int x,a;
    char str[21];
    cin>>x;
    for(int i = 1 ; i <= x ; i++){
        cin>>str;
        if(strcmp(str,"LIN") == 0){
            cin>>a;
            que.push_front(a);

        }else
        if(strcmp(str,"RIN") == 0){
            cin>>a;
            que.push_back(a);

        }else
        if(strcmp(str,"LOUT") == 0){
           if(que.empty()){
                t[i] = 1;
           }else{
               que.pop_front();
           }

        }else
        if(strcmp(str,"ROUT") == 0){
           if(que.empty()){
                t[i] = 1;
           }else{
               que.pop_back();
           }
        }
    }

    int aa = que.front() ;
    que.pop_front() ;
    cout<<aa;
    while(!que.empty())
    {
         int aa = que.front() ;
         que.pop_front() ;
         cout<<" "<<aa;
    }
    cout<<endl;
    for(int i = 1 ; i <= x ; i++)
    {
        if(t[i])
            cout<<i<<" ERROR"<<endl;
    }
    return 0;
}


原题链接:山理工1466

你可能感兴趣的:(刷题,SDUT)