• 队栈


    题目描述


    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 会将 A 1 加入队栈。
            • 在之后的每次 push 操作中,假设 Yazid 上次 push 时加入的数是 A i ,则本次他会将 A i+1 加入队栈。特别地,如果 i = n,则 Yazid 本次会将 A 1 加入队栈。
    请你依次输出 Yazid 通过 print 操作获得的整数。


    输入格式


    从文件 staqueue.in 中读入数据。
    第 1 行一个整数 n,表示插入序列的长度。
    第 2 行 n 个用单个空格隔开的非负整数 A 1 , A 2 , . . . , A n ,描述插入序列。
    第 3 行一个整数 Q,表示操作数目。
    第 4 行 Q 个紧挨着的 1 ∼ 4 之间的数字,依次描述每个操作,每个数字表示操作
    的编号(各操作对应的编号见题目描述)

    • 保证所有操作的合法性。即保证:
    – 执行任意 pop_queue 和 pop_stack 操作时队栈不为空。
    – 执行任意 print 操作时黑盒不为空。


    输出格式


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

    样例输入#1

    2

    1 2

    7

    1112324

    样例输出#1

    112

    样例输入#2

    4

    0 23 330 6

    12

    121313124134

    样例输出#2

    23306

    0

    参考代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #define ll long long
    6. using namespace std;
    7. vector <int> v;
    8. queue <int> c;
    9. vector <int> ans;
    10. int main()
    11. {
    12. int n;
    13. cin>>n;
    14. for(int i=0;i
    15. {
    16. int x;
    17. cin>>x;
    18. c.push(x);
    19. }
    20. int Q;
    21. cin>>Q;
    22. string s;
    23. cin>>s;
    24. for(int i = 0; i < Q; i++)
    25. {
    26. int x = s[i] - '0';
    27. if(x == 1)
    28. {
    29. v.push_back(c.front());
    30. int t = c.front();
    31. c.pop();
    32. c.push(t);
    33. }
    34. else if(x == 2)
    35. {
    36. ans.push_back(*(v.begin()));
    37. v.erase(v.begin());
    38. }
    39. else if(x == 3)
    40. {
    41. ans.push_back(*(v.end() - 1));
    42. v.erase(v.end() - 1);
    43. }
    44. else
    45. {
    46. bool flag = false;
    47. for(vector<int>::iterator iter = ans.begin(); iter != ans.end(); iter++)
    48. {
    49. if(*iter != 0)
    50. {
    51. flag = true;
    52. break;
    53. }
    54. }
    55. if(flag)
    56. {
    57. bool f = false;
    58. for(vector<int>::iterator iter = ans.begin(); iter != ans.end(); iter++)
    59. {
    60. if(*iter != 0)
    61. f = true;
    62. if(f)
    63. cout<<*iter;
    64. }
    65. }
    66. else
    67. cout<<0;
    68. cout<
    69. ans.clear();
    70. }
    71. }
    72. return 0;
    73. }

  • 相关阅读:
    postMessage,addEventListener, 前端跨域请求之js代码解析
    ArcGis课程设计
    【漏洞复现】NUUO摄像头存在远程命令执行漏洞
    剑指 Offer 53 - I. 在排序数组中查找数字 I
    Semantic Kernel 将成为通向Assistants的门户
    elementPlus 图标不显示 属性模式不显示
    第一篇-专题说明及当前进度
    jar 命令启动java 指定配置文件路径 jar如何启动
    K-近邻算法分类和回归
    《谷歌眼镜》新书作者:眼镜需要成为AR的载体吗?
  • 原文地址:https://blog.csdn.net/panpanpan17452/article/details/133895197