zoukankan      html  css  js  c++  java
  • 算法笔记-数组实现栈,队列

      上篇写到了堆排,其实最主要的是使用数组实现堆结构,那么如何使用数组实现栈,队列呢?

      首先我们简单了解栈的数据结构:栈是一种先进后出的结构,如下图可以看到按顺序进入的3->2->5,那么取出的顺序则为5->2->3。

     如果使用数组实现,那就需要记住我最新插入的数是哪个,然后倒推取出,代码如下:

    public class ArrayStack{
            private int[] arr;
            private int size;
    
            ArrayStack(int initSize){
                if(initSize <= 0) throw new IllegalArgumentException("The init size is less than 0");
    
                arr = new int[initSize];
            }
    
            public void push(int a){
                if(size + 1 >arr.length-1 ){
                    throw new IllegalArgumentException("The stack is full");
                }
                arr[size++] = a;
            }
    
            public int pop(){
                if(size -1 < 0){
                    throw new IllegalArgumentException("The stack is empty");
                }
                return arr[size--];
            }
        }

    代码很简单,就不多说了。

    再看看队列,队列和栈不一样,是需要按顺序先进先出的,就像我们食堂排队打饭一样,先到的先打。那么用数组如何实现呢,看代码实现:

    public class ArrayQueue{
            private int[] arr;
            private int size;
            private int write;
            private int read;
    
            ArrayQueue(int initSize){
                if(initSize <= 0) throw new IllegalArgumentException("The init size is less than 0");
    
                arr = new int[initSize];
            }
    
            public void push(int a){
                if(size + 1 >arr.length-1 ){
                    throw new IllegalArgumentException("The queue is full");
                }
                write  = write+1 >arr.length-1 ? 0 : write+1;
                arr[write] = a;
                size ++;
            }
    
            public int pop(){
                if(size <= 0){
                    throw new IllegalArgumentException("The queue is empty");
                }
                size--;
                int temp = read;
                read = read -1 < 0 ? arr.length-1 : read-1;
                return arr[temp];
            }
        }

    这里分别用read来记录取数据的位置,write记录插入数据的位置,数组实现队列有一个复杂的情况就是你取出先进的数据之后,数组前部分就空出来了,所以我们插入到数组最后时,需要回到开头重新插。

      

  • 相关阅读:
    【数论】好推不好记的扩展欧几里德
    【GDOI2016模拟3.11】历史
    【NOIP2013模拟】守卫者的挑战(期望概率)
    【NOIP2015模拟10.27】魔道研究
    【NOIP2015模拟10.27】挑竹签
    【NOIP2015模拟10.22】最小代价
    【NOIP2015模拟10.22】最大子矩阵
    【NOIP2015模拟10.22】矩形
    【NOI2013模拟】棋盘游戏
    机器人M号
  • 原文地址:https://www.cnblogs.com/gmt-hao/p/14860683.html
Copyright © 2011-2022 走看看