双端队列的使用

蒜头君学习完数据结构之后,发现这种普通的栈已经不能满足自己的需求了。于是蒜头君想自己手动写一个超级栈。超级栈和普通栈不同的是,如果自己想往栈底添加数据的话,可以通过把栈翻转,然后再往栈顶添加数据来完成。听起来是不是觉得这个栈很厉害?

对于超级栈的操作有四种:

(1) 11 表示把栈反转

(2) 22 表示把栈顶元素出栈

(3) 3 \ x3 x 表示把 xx 放到栈顶

(4) 44 表示把栈内所有的元素从栈底开始打印出来,如果栈内没有元素,只需要打印空行。

既然你这么厉害,那么蒜头君决定把这个伟大而又艰巨的任务交给了你。

输入格式

第一行输入一个整数 nn (1 \le n \le 10000)(1n10000),表示操作次数。

之后 nn 行输入这四种操作。

输出格式

完成上述的操作(题目保证所有的数据都是合法的,不会出现空栈pop)。

样例输入
7
3 2
3 1
1
3 3
4
2
4
样例输出
1 2 3
1 2
 
  
#include<iostream>  
#include<cstdio>  
#include<queue>  
using namespace std;  
deque<int>q;  
bool flag=true;  
int main()  
{  
    int n,op;  
    cin>>n;  
    while(n--)  
    {  
        cin>>op;  
        if(op==1)  
        {  
            flag^=1;  
        }  
        else if(op==2)  
        {  
            if(flag)  
                q.pop_back();  
            else  
                q.pop_front();  
        }  
        else if(op==3)  
        {  
            int x;  
            cin>>x;  
            if(flag)  
            q.push_back(x);  
            else  
            q.push_front(x);  
        }  
        else if(op==4)  
        {  
            if(flag)  
            {  
                if(q.size())  
                {  
                    cout<<q[0];  
                    for(int i=1;i<q.size();++i)  
                    cout<<' '<<q[i];  
                }  
                cout<<endl;  
            }  
            else  
            {  
                if(q.size())  
                {  
                    int sz=q.size();  
                    cout<<q[sz-1];  
                    for(int i=sz-2;i>=0;i--)  
                    cout<<' '<<q[i];  
                }  
                cout<<endl;  
            }  
              
        }  
    }  
    return 0;  
}  
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
deque<int>q;
int flag=1;
int main()
{
    int n,op;
    cin>>n;
    while(n--)
    {
        cin>>op;
        if(op==1)
        {
            flag++;
        }
        else if(op==2)
        {
            if(flag%2==0)
                q.pop_back();
            else
                q.pop_front();
        }
        else if(op==3)
        {
            int x;
            cin>>x;
            if(flag%2==0)
            q.push_back(x);
            else
            q.push_front(x);
        }
        else if(op==4)
        {
            if(flag%2==0)
            {
                if(q.size())
                {
                    cout<<q[0];
                    for(int i=1;i<q.size();++i)
                    cout<<' '<<q[i];
                }
                cout<<endl;
            }
            else
            {
                if(q.size())
                {
                    int sz=q.size();
                    cout<<q[sz-1];
                    for(int i=sz-2;i>=0;i--)
                    cout<<' '<<q[i];
                }
                cout<<endl;
            }

        }
    }
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值