#64. 双结构调度器

双结构调度器

双结构调度器

题目背景

在某在线判题系统(OJ)中,请求会以不同优先规则进入系统。为了处理这些请求,系统维护了两个数据结构:

  • 一个 栈 S(后进先出)
  • 一个 队列 Q(先进先出)

系统支持多种操作,请你模拟整个过程,并输出查询结果。

初始时,栈 S 和队列 Q 均为空。

系统会给出 n 条操作,每条操作为以下之一:

操作 含义
PUSH x 将整数 x 压入栈 S
ENQUEUE x 将整数 x 加入队列 Q
MOVE_SQ 若栈 S 非空,则将栈顶元素弹出并加入队列 Q
MOVE_QS 若队列 Q 非空,则将队首元素取出并压入栈 S
POP_S 若栈 S 非空,弹出栈顶元素
POP_Q 若队列 Q 非空,弹出队首元素
QUERY 输出当前「栈顶元素 + 队首元素」的和;若某一结构为空,则将该部分视为 0

输入格式

第一行一个整数 nn,表示操作数。

接下来 nn 行,每行为以下字符串之一:

  • PUSH x:将整数 x 压入栈 S
  • ENQUEUE x:将整数 x 加入队列 Q
  • MOVE_SQ:若栈 S 非空,则将栈顶元素弹出并加入队列 Q
  • MOVE_QS:若队列 Q 非空,则将队首元素取出并压入栈 S
  • POP_S:若栈 S 非空,弹出栈顶元素
  • POP_Q:若队列 Q 非空,弹出队首元素
  • QUERY:输出当前「栈顶元素 + 队首元素」的和;若某一结构为空,则将该部分视为 0

其中 xx 为整数,满足 x109|x| ≤ 10^9

输出格式

对于每条 QUERY 操作,输出一行结果。

12
PUSH 5
PUSH 3
ENQUEUE 10
QUERY
MOVE_SQ
QUERY
MOVE_QS
QUERY
POP_S
QUERY
POP_Q
QUERY
13
15
13
8
5

样例解释

操作过程如下:

操作 栈 S 队列 Q
PUSH 5 [5][5] $ [][]
PUSH 3 [5,3][5, 3]
ENQUEUE 10 [10][10]
QUERY 5+105 + 10
MOVE_SQ [5][5] [10,3][10,3]
QUERY 5+10=155 + 10 = 15
MOVE_QS [5,10][5,10] [3][3]
QUERY 10+3=1310 + 3 = 13
POP_S [5][5] [3][3]
QUERY 5+3=85 + 3 = 8
POP_Q [5][5] [][]
QUERY 5+0=55 + 0 = 5

数据范围

对于 25%25\% 的数据:1n1001 \leq n \leq 100,所有操作中不包含 MOVE_SQMOVE_QS

对于 50%50\% 的数据:1n10001 \leq n \leq 1000

对于 100%100\% 的数据:

  • 1n2×1051 \leq n \leq 2 \times 10^5
  • xx 为整数,满足 x109|x| \leq 10^9
  • 保证不会对空栈或空队列执行弹出操作;