• 数据结构——队列


    目录

    1.队列元素逆置

    C语言

    C++

    2.约瑟夫环

    3.栈实现队列

    4.用队列实现栈


    1.队列元素逆置

    【问题描述】

    已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。

    【输入形式】

    输入的第一行为队列元素个数,第二行为队列从首至尾的元素

    【输出形式】

    输出队列的逆置

    【样例输入】

    3
    1 2 3

    【样例输出】

    3 2 1

    【评分标准】

    需采用队列与栈的知识,否则不能得分

    C语言

    1. #include
    2. #include
    3. #define MAX_SIZE 3000
    4. typedef struct {
    5. int data[MAX_SIZE];
    6. int front;
    7. int rear;
    8. } Queue;
    9. void initQueue(Queue *q) {
    10. q->front = 0;
    11. q->rear = -1;
    12. }
    13. int isEmpty(Queue *q) {
    14. return q->front > q->rear;
    15. }
    16. void enqueue(Queue *q, int item) {
    17. if (q->rear == MAX_SIZE - 1) {
    18. printf("Error: Queue is full\n");
    19. exit(1);
    20. }
    21. q->rear++;
    22. q->data[q->rear] = item;
    23. }
    24. int dequeue(Queue *q) {
    25. if (isEmpty(q)) {
    26. printf("Error: Queue is empty\n");
    27. exit(1);
    28. }
    29. int item = q->data[q->front];
    30. q->front++;
    31. return item;
    32. }
    33. typedef struct {
    34. int data[MAX_SIZE];
    35. int top;
    36. } Stack;
    37. void initStack(Stack *s) {
    38. s->top = -1;
    39. }
    40. int isStackEmpty(Stack *s) {
    41. return s->top == -1;
    42. }
    43. void push(Stack *s, int item) {
    44. if (s->top == MAX_SIZE - 1) {
    45. printf("Error: Stack is full\n");
    46. exit(1);
    47. }
    48. s->top++;
    49. s->data[s->top] = item;
    50. }
    51. int pop(Stack *s) {
    52. if (isStackEmpty(s)) {
    53. printf("Error: Stack is empty\n");
    54. exit(1);
    55. }
    56. int item = s->data[s->top];
    57. s->top--;
    58. return item;
    59. }
    60. void reverseQueue(Queue *q) {
    61. if (isEmpty(q)) {
    62. return;
    63. }
    64. Stack s;
    65. initStack(&s);
    66. while (!isEmpty(q)) {
    67. push(&s, dequeue(q));
    68. }
    69. while (!isStackEmpty(&s)) {
    70. enqueue(q, pop(&s));
    71. }
    72. }
    73. int main() {
    74. Queue q;
    75. initQueue(&q);
    76. int size;
    77. scanf("%d", &size);
    78. int i;
    79. for ( i = 0; i < size; i++) {
    80. int item;
    81. scanf("%d", &item);
    82. enqueue(&q, item);
    83. }
    84. reverseQueue(&q);
    85. while (!isEmpty(&q)) {
    86. printf("%d ", dequeue(&q));
    87. }
    88. printf("\n");
    89. return 0;
    90. }

    C++

    1. #include
    2. int main()
    3. {
    4. int QUEUE[1000],STACK[1000],i,n,temp,top,front,rear;
    5. front=rear=top=-1;
    6. scanf("%d",&n);
    7. for(i=0;i
    8. {
    9. scanf("%d",&temp);
    10. rear++;
    11. QUEUE[rear]=temp;
    12. }
    13. for(i=0;i
    14. {
    15. temp=QUEUE[++front];
    16. STACK[++top]=temp;
    17. }
    18. while(top!=-1)
    19. {
    20. printf("%d ",STACK[top]);
    21. top--;
    22. }
    23. return 0;
    24. }

    2.约瑟夫环

    【问题描述】

    n个人围成一个圈,按顺时针方向一次编号1、2、3、……、n,从第一个人开始顺时针方向依次报数1、2、3、……,报数m的人被淘汰,然后下一个人再从1开始报数,一直重复该过程。由于人数是有限的,因此最后一定只会剩下一个人,求这个人的编号。

    【输入形式】

    第一行,一个整数n,表示约瑟夫环的总人数。

    第二行,一个整数m,表示报到m的人被淘汰。

    【输出形式】

     一行,一个整数,约瑟夫环最终剩下的人的编号。

    【样例输入】

    5
    2

    【样例输出】

    3

    【样例说明】

    5个人围成一圈,编号1,2,3,4,5;

    第一轮,2号淘汰,剩下1,3,4,5;

    第二轮,从3开始报数,4号淘汰,剩下1,3,5;

    第三轮,从5开始报数,1号淘汰,剩下3,5;

    第四轮,从3开始报数,5号淘汰,剩下3。
    【评分标准】

    通过所有数据

    1. class Queue:
    2. #initialization
    3. def __init__(self):
    4. self.q = []
    5. #入队
    6. def enqueue(self, num):
    7. self.q.append(num)
    8. #出队
    9. def dequeue(self):
    10. if self.isEmpty():
    11. return "The queue is EMPTY!"
    12. else:
    13. return self.q.pop(0)
    14. def get_len(self):
    15. return len(self.q)
    16. def isEmpty(self):
    17. return self.get_len()==0
    18. joseph = Queue()
    19. n = int(input())
    20. m = int(input())
    21. for i in range(1,n+1):
    22. joseph.enqueue(i)
    23. while(joseph.get_len()!=1):
    24. count = 1
    25. while(True):
    26. if(count!=m):
    27. joseph.enqueue(joseph.dequeue())
    28. count += 1
    29. else:
    30. joseph.dequeue()
    31. break
    32. print(joseph.dequeue())

    3.栈实现队列

    【问题描述】

    请使用栈类实现队列的类。

    【输入形式】

    第一行一个整数n,

    接下来n行,每行一个整数,依次表示已经在队列中的数。

    接下来一行,一个整数m。

    接下来m行,有两种情况:1. 一个整数,请将其入列。2. 字符串"D",表示出列操作。

    【输出形式】

    若干行,每行一个出列的输出。

    【样例输入】

    3
    1
    2
    3
    2
    4
    D

    【样例输出】

    1

    【样例说明】

    队列中原来有1,2,3三个数,第一个操作使4入列,第二个操作出列,弹出队头的1
    【评分标准】

    通过所有数据

    1. class Stack:
    2. def __init__(self):
    3. self.s = []
    4. def push(self, num):
    5. self.s.append(num)
    6. def out(self):
    7. return self.s.pop()
    8. def empty(self):
    9. return len(self.s)==0
    10. class Queue:
    11. def __init__(self):
    12. self.s1 = Stack()
    13. self.s2 = Stack()
    14. def enq(self, num):
    15. self.s1.push(num)
    16. def deq(self):
    17. while(not self.s1.empty()):
    18. self.s2.push(self.s1.out())
    19. temp= self.s2.out()
    20. while(not self.s2.empty()):
    21. self.s1.push(self.s2.out())
    22. return temp
    23. n = int(input())
    24. q = Queue()
    25. for i in range(n):
    26. q.enq(int(input()))
    27. m = int(input())
    28. for i in range(m):
    29. op = input()
    30. if op.isdigit():
    31. q.enq(int(op))
    32. elif op=="D":
    33. print(q.deq())

    4.用队列实现栈

    【问题描述】

    用队列实现一个栈。本题要求使用队列实现栈,其他实现方式不计分。
    【输入形式】

    第一行输入数n,接下来n行输入一些数,表示已经在栈里的数

    接下来输入数m,接下来m行输入指令,A表示入栈,B表示出栈,具体看样例
    【输出形式】

    第一行输出弹出栈的数字们,用空格隔开

    第二行弹出栈内剩余的数,并用空格隔开
    【样例输入】

    3
    1
    2
    3
    5
    A 5
    A 6
    B 
    B
    B

    【样例输出】

    6 5 3
    2 1

    【样例说明】

    出现异常还是输出一行‘No’
    【评分标准】

    1. class SQueue(object):
    2. def __init__(self, init_len=8):
    3. self.__elem = [0] * init_len
    4. self.__len = init_len
    5. self.__head = 0
    6. self.__num = 0
    7. def __extend(self):
    8. old_len = self.__len
    9. self.__len *= 2
    10. new_elems = [0] * self.__len
    11. for i in range(old_len):
    12. new_elems[i] = self.__elem[(self.__head + i) % old_len]
    13. self.__elem, self.__head = new_elems, 0
    14. def is_empty(self):
    15. return self.__num == 0
    16. def peek(self):
    17. if self.__num == 0:
    18. raise QueueUnderflow
    19. return self.__elem[self.__head]
    20. def enqueue(self, e):
    21. if self.__num == self.__len:
    22. self.__extend()
    23. self.__elem[(self.__head + self.__num) % self.__len] = e
    24. self.__num += 1
    25. def dequeue(self):
    26. if self.__num == 0:
    27. raise QueueUnderflow
    28. e = self.__elem[self.__head]
    29. self.__head = (self.__head + 1) % self.__len
    30. self.__num -= 1
    31. return e
    32. def get_elem(self):
    33. print(self.__elem)
    34. class Stack():
    35. def __init__(self):
    36. self.__stack = SQueue()
    37. self.__temp = SQueue()
    38. def push(self, e):
    39. while not self.__stack.is_empty():
    40. self.__temp.enqueue(self.__stack.dequeue())
    41. self.__stack.enqueue(e)
    42. while not self.__temp.is_empty():
    43. self.__stack.enqueue(self.__temp.dequeue())
    44. def pop(self):
    45. return self.__stack.dequeue()
    46. def is_empty(self):
    47. return self.__stack.is_empty()
    48. n = int(input())
    49. stack = Stack()
    50. for i in range(n):
    51. stack.push(int(input()))
    52. mark = 0
    53. tmp = []
    54. m = int(input())
    55. for i in range(m):
    56. o = input()
    57. if 'A' in o:
    58. o = int(o.strip().split()[1])
    59. stack.push(o)
    60. elif 'B' in o:
    61. try:
    62. tmp += [stack.pop()]
    63. except:
    64. mark = 1
    65. break
    66. if mark == 1:
    67. print('No')
    68. else:
    69. tmp = [str(i) for i in tmp]
    70. print(' '.join(tmp))
    71. _ = []
    72. while not stack.is_empty():
    73. _ += [str(stack.pop())]
    74. print(' '.join(_))

  • 相关阅读:
    461. 汉明距离
    un7.29:Linux——如何在docker中安装tomcat?
    笔记 记录
    今天的码农女孩学习了关于react的组件的知识
    D. Divide and Sum(组合数学)
    GD32与STM32在使用过程中的区别
    【计算机系统结构】指令级高度并行的超级计算机
    现货白银实时交易平台的成长阶段 你出在哪个阶段?
    前端·在线随机生成图片 & 免费 API
    【C语言库函数模拟实现 】# Strlen()
  • 原文地址:https://blog.csdn.net/timberman666/article/details/133844422