• 队列(循环数组队列,用队列实现栈,用栈实现队列)


    基础知识

    队列(Queue):先进先出的数据结果,底层由双向链表实现

    入队列:进行插入操作的一端称为队尾
    出队列:进行删除操作的一端称为对头

    常用方法

    boolean offer(E e)  入队

    E(弹出元素的类型) poll() 出队

    peek() 获取队头

    int size 获取队列元素个数

    boolean isEmpty() 判定队列是否为空

    设计循环队列

    链接:https://leetcode.cn/problems/design-circular-queue/description/ 

    思路:创建一个数组,useSize记录这个数组有效元素个数,rear记录这个数组(队列)下一个要插入的位置,front记录这个队列的对头,也就是要删除元素的位置.

    插入元素:如果这个数组已经满了(useSize等于数组的长度),则插入失败返回false,没满就是往rear指向的位置放入一个元素,然后rear++,useSize++,值得注意的是这是一个循环队列,当rear指向的是数组的最后一个下标也就是(array.length-1),此时再如果让rear++,它就指向了array.length.数组是越界的,我们可以给一个判断条件,如果rear等于array.length,就让它重新等于0

    删除元素:如果这个队列是空,则删除失败,不为空,就让front++,useSize--,这样就可以删除了,同理front也可能指向array.lenth,让他重新指向0就好了

    获取队头元素:当队列为空获取失败,不为空就返回front下标指向的元素

    获取队尾元素:当队列为空获取失败,不为空,因为rear指向的是下一个要插入的元素的位置,所以我们返回rear-1下标的元素就是当前的队尾元素,注意的是,当rear指向的是0时,也不为空说明它刚刚循环过来的,此时队尾元素就是数组最后的下标元素,返回即可

    是否为空:useSize为0就为空,是否为满:useSize等于数组长度队列就满了

    代码

    1. class MyCircularQueue {
    2. private int[] array;
    3. private int front;
    4. private int rear;
    5. private int useSize;
    6. private int size;
    7. public MyCircularQueue(int k) {
    8. array = new int[k];
    9. size = k;
    10. }
    11. public boolean enQueue(int value) {
    12. if(isFull()){
    13. return false;
    14. }
    15. array[rear] = value;
    16. rear++;
    17. if(rear==size){
    18. rear=0;
    19. }
    20. useSize++;
    21. return true;
    22. }
    23. public boolean deQueue() {
    24. if(isEmpty()){
    25. return false;
    26. }
    27. front++;
    28. if(front==size){
    29. front=0;
    30. }
    31. useSize--;
    32. return true;
    33. }
    34. public int Front() {
    35. if(isEmpty()){
    36. return -1;
    37. }
    38. return array[front];
    39. }
    40. public int Rear() {
    41. if(isEmpty()){
    42. return -1;
    43. }
    44. if(rear-1<0){
    45. return array[size-1];
    46. }
    47. return array[rear-1];
    48. }
    49. public boolean isEmpty() {
    50. return useSize==0;
    51. }
    52. public boolean isFull() {
    53. return useSize==size;
    54. }
    55. }

    用队列实现栈

    链接:https://leetcode.cn/problems/implement-stack-using-queues/

    思路
    创建俩个队列,qu1 和 qu2
    入栈,如果qu1和qu2都为空(第一次入栈),就放入到qu1队列中,否则就入到不为空的队列中
    出栈:找到不为空的队列,把useSize-1个元素移动到另一个队列当中去,如果俩个队列都为空,则出栈失败
    查看栈顶元素:如果俩个队列都为空,查看失败,找到不为空的队列,把useSIze个元素移动到另一个队列中,每次入队列都用一个值来接收,这样入队列完成后,这个值就是栈顶元素,把它返回即可

    1. class MyStack {
    2. private Queue qu1;
    3. private Queue qu2;
    4. public MyStack() {
    5. qu1 = new LinkedList<>();
    6. qu2 = new LinkedList<>();
    7. }
    8. public void push(int x) {
    9. if(!qu1.isEmpty()){
    10. qu1.offer(x);
    11. }else if(!qu2.isEmpty()){
    12. qu2.offer(x);
    13. }else{
    14. qu1.offer(x);
    15. }
    16. }
    17. public int pop() {
    18. if(empty()){
    19. return -1;
    20. }
    21. if(!qu1.isEmpty()){
    22. int size = qu1.size();
    23. for(int i = 0;i1;i++){
    24. int x = qu1.poll();
    25. qu2.offer(x);
    26. }
    27. return qu1.poll();
    28. }else{
    29. int size = qu2.size();
    30. for(int i = 0;i1;i++){
    31. int x = qu2.poll();
    32. qu1.offer(x);
    33. }
    34. return qu2.poll();
    35. }
    36. }
    37. public int top() {
    38. if(empty()){
    39. return -1;
    40. }
    41. if(!qu1.isEmpty()){
    42. int size = qu1.size();
    43. int x = -1;
    44. for(int i = 0;i
    45. x = qu1.poll();
    46. qu2.offer(x);
    47. }
    48. return x;
    49. }else{
    50. int size = qu2.size();
    51. int x = -1;
    52. for(int i = 0;i
    53. x = qu2.poll();
    54. qu1.offer(x);
    55. }
    56. return x;
    57. }
    58. }
    59. public boolean empty() {
    60. return qu1.isEmpty() && qu2.isEmpty();
    61. }
    62. }

    用栈实现队列

    链接:https://leetcode.cn/problems/implement-queue-using-stacks/


    思路:
    创建俩个栈,
    入队:直接放到第一个栈中,
    出队:出第二个队列中的数据,如果第二个队列中没有,就把第一个栈中的所有元素弹入到第二个栈中,
    (第二个栈的顺序就是队列的顺序) 

    代码

    1. class MyQueue {
    2. private Stack qu1;
    3. private Stack qu2;
    4. public MyQueue() {
    5. qu1 = new Stack();
    6. qu2 = new Stack();
    7. }
    8. public void push(int x) {
    9. qu1.push(x);
    10. }
    11. public int pop() {
    12. if(empty()){
    13. return -1;
    14. }
    15. if(qu2.isEmpty()){
    16. int size = qu1.size();
    17. while(size != 0){
    18. int x = qu1.pop();
    19. qu2.push(x);
    20. size--;
    21. }
    22. }
    23. return qu2.pop();
    24. }
    25. public int peek() {
    26. if(empty()){
    27. return -1;
    28. }
    29. if(qu2.isEmpty()){
    30. int size = qu1.size();
    31. while(size != 0){
    32. int x = qu1.pop();
    33. qu2.push(x);
    34. size--;
    35. }
    36. }
    37. return qu2.peek();
    38. }
    39. public boolean empty() {
    40. return qu1.isEmpty() && qu2.isEmpty();
    41. }
    42. }

  • 相关阅读:
    Apifox简单了解——WEB端测试的集大成者
    这份工具清单,令Python 提速N倍,简直太好用了
    初步认识 Web Components 并实现一个按钮
    Python算法例8 将整数A转换为B
    springboot-starter如何整合阿里云datahub呢?
    Himall商城类型帮助类将string类型转换成datetime类型
    115 双周赛
    每日一题 2034. 股票价格波动(中等,有序队列)
    [carla]把carla世界坐标系 转换为 俯视地图像素坐标系
    Linux:详细介绍如何挂载?及其命令
  • 原文地址:https://blog.csdn.net/qq_62712350/article/details/131833734