• 深入理解数据结构(2)——用数组实现队列


    数组是一种数据结构,队列也是一种数据结构。它们都是由基础的语法实现的。

    如果一个数据结构可以用另外的数据结构来实现,那么可以有力的证明——“数据结构是一种思想”,是一种讲语法组合起来实现某种功能的手段

    “整体大于局部”

    一、队列的特点——要实现哪些功能?

    从尾进,从头出

    对于数组来说,每次从尾部插入元素,从头部删除元素。当数组后端插满元素的时候,此时前端删除元素就会导致——数组前端因为删除元素变空,后部因插入元素变满。如何解决这个问题?

    我们可以设想有这样一个环形数组——刚开始两只指针front和rear都在0下标。每放入一个元素,rear就会往后走一步;每从队头front处出一个元素,front就会往后走一步(但是移除数据会导致前面位置有空缺)。如果rear移到最后一位是,再插入元素,rear就会移到数组的0下标处。这样问题就得到解决。

    这里有两个问题:1、rear从7下标到0下标怎么过去?2、如何判断此事是空还是满?

    问题1:不要用rear++,因为无法处理7下标到0下标的问题,用——rear = (rear + 1) % length

    问题2:rear下一位是front,说明是满的。如果rear和front的下标是相同的,说明是空的

    二、代码实现

    1. class MyCircularQueue {
    2. private int[] elem;
    3. private int front;//表示队列的头
    4. private int rear;//表示队列的尾
    5. public MyCircularQueue(int k) {
    6. /*这里创建数组时要多用一个空间,如果想要放置7个元素的话,在放第6个元素的时候,rear在最后一
    7. *个下标处,他后面就是front。如果此时放入第7个元素,会被判定为“满”。所以要多要一个空间
    8. */
    9. this.elem = new int[k+1];
    10. }
    11. /**
    12. * 入队列
    13. */
    14. public boolean enQueue(int value) {
    15. //1、检查是否队列是满的
    16. if(isFull()){
    17. return false;
    18. }
    19. elem[rear] = value;
    20. rear = (rear+1) % elem.length;
    21. return true;
    22. }
    23. /**
    24. * 出队列
    25. */
    26. public boolean deQueue() {
    27. if(isEmpty()) {
    28. return false;
    29. }
    30. //front++;
    31. front = (front+1) % elem.length;
    32. return true;
    33. }
    34. /**
    35. * 得到队头元素
    36. */
    37. public int Front() {
    38. if(isEmpty()) {
    39. return -1;
    40. }
    41. return elem[front];
    42. }
    43. /**
    44. * 得到队尾元素
    45. */
    46. public int Rear() {
    47. if(isEmpty()) {
    48. return -1;
    49. }
    50. //return (rear-1); 不可以这样写,因为当rear在0下标时会为-1
    51. int index = (rear == 0) ? elem.length-1 : rear-1;
    52. return elem[index];
    53. }
    54. public boolean isEmpty() {
    55. return front == rear;
    56. }
    57. /**
    58. * 队列是否为满
    59. */
    60. public boolean isFull() {
    61. //如果real的下一位是front,则说明是满的
    62. /* if( (rear+1) % elem.length == front) {
    63. return true;
    64. }
    65. return false;*/
    66. return (rear+1) % elem.length == front;
    67. }
    68. }

  • 相关阅读:
    私活之安卓视频app
    一个在使用react时突然遇到的问题
    前端小案例-图片存放在远端服务器
    QT:QSS自定义 QAbstractScrollArea实例
    Hadoop 集群的安装与配置
    PIE-engine 教程 ——提取黄河流域/山西省1980—2018年流域降水量并对比分析
    05.SpringCloudAlibaba-注册中心Nacos
    SQL SERVER LSN
    C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现
    【AI应用探讨】— Gemma2模型应用场景
  • 原文地址:https://blog.csdn.net/From_C/article/details/134074055