模拟题-队栈

【题目描述】

Yazid 是一名 OI 初学者。他最近在研究基础数据结构:队列和栈。某天,Yazid 脑 洞大开,发明了一种叫做“队栈”的数据结构。 众所周知,队列是先进先出的数据结构,而栈是先进后出的数据结构。而 Yazid 发 明的队栈则同时支持查询并删除其中最. 早. 被. 插. 入. 的. 元. 素. 和最. 晚. 被. 插. 入. 的. 元. 素. 。 Yazid 有一个初始为空的队栈和一个黑. 盒. (这是一个存放数字的盒子),接下来,他 要依次执行 Q 个操作。操作分为 4 种: 1. push:将一个非负整数加入队栈。 2. pop_queue:找出队栈中最早. 被插入的元素,将其取出放入黑盒,并从队栈中删 除。 3. pop_stack:找出队栈中最晚. 被插入的元素,将其取出放入黑盒,并从队栈中删 除。 4. print:将黑盒中的所有数取出,并按被放入的先后顺序从左到右排列得到一个 整数。 • 例如:黑盒中依次被放入了 0, 23, 330, 6,那么获得并打印的整数即是 233306。 由于 Yazid 懒得在每次 push 操作时想插入的数,因此他提前写好了一个长度为 n 的插入序列 A(下标从 1 开始)。在接下来的所有 push 操作中,Yazid 会依次地、循环 地将这些数加入队栈。具体来说: • 在首次 push 操作时,Yazid 会将 A1 加入队栈。 • 在之后的每次 push 操作中,假设 Yazid 上次 push 时加入的数是 Ai,则本次他 会将 Ai+1 加入队栈。特别地,如果 i = n,则 Yazid 本次会将 A1 加入队栈。 请你依次输出 Yazid 通过 print 操作获得的整数。

【输入格式】

从文件 staqueue.in 中读入数据。 第 1 行一个整数 n,表示插入序列的长度。 第 2 行 n 个用单个空格隔开的非负整数 A1, A2, . . . , An,描述插入序列。 第 3 行一个整数 Q,表示操作数目。 第 4 行 Q 个紧挨着的 1 ∼ 4 之间的数字,依次描述每个操作,每个数字表示操作 的编号(各操作对应的编号见【题目描述】)。 • 保证所有操作的合法性。即保证: – 执行任意 pop_queue 和 pop_stack 操作时队栈不为空。 – 执行任意 print 操作时黑盒不为空。 第 4 页 共 11 页 CSP-J 2023 模拟赛 队栈(staqueue)

【输出格式】

输出到文件 staqueue.out 中。 对于所有 print 操作,输出一行一个整数,表示该 print 操作中 Yazid 获得的数。

【样例 1 输入】

 2

 1 2

7

1112324

【样例 1 输出】

112

【样例 2 输入】

4

 0 23 330 6

12

121313124134

【样例 2 输出】

233306

 0

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[10100],l;
char x;
deque<long long> d;
queue<long long> q;
int main(){
    freopen("staqueue.in","r",stdin);
    freopen("staqueue.out","w",stdout);
    cin>>n;
    for(long long i=1;i<=n;i++) cin>>a[i];
    cin>>k;
    while(k--){
        cin>>x;
        if(x=='1'){
            d.push_back(a[l%n+1]);
            l++;
        }else if(x=='2'){
            q.push(d.front());
            d.pop_front();
        }else if(x=='3'){
			q.push(d.back());
            d.pop_back();
		}else if(x=='4'){
			if(q.empty()){
				cout<<0<<endl;
				continue;
			}
			while(1){
				if(q.front()==0) q.pop();
				else break;
				if(q.empty()) break;
			}
			if(q.empty()){
				cout<<0<<endl;
				continue;
			}
			long long S=q.size();
			for(long long i=1;i<=S;i++){
				cout<<q.front();
				q.pop();
			}
			cout<<endl;
		}
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值