数据结构与算法(二)(栈、队列)

这篇笔记主要写栈和队列,因为他们的特点是相反的

一、栈

  

  特点:先进后出,类似于子弹入弹夹,先进去的子弹最后才发射

  这里也使用数组来模拟一下,有四个方法,压栈,取栈,查看栈顶,是否为空

  

//栈的底层我们使用数组来存储数据
        int[] elements;
        
        public StackTest1() {
            elements = new int[0];
        }
        
        //压栈(压入元素)
        public void push(int element){
            // 创建一个新的数组
            int[] newArr = new int[elements.length + 1];
            // 把原数据复制到新数组中
            for (int i = 0; i < elements.length; i++) {
                newArr[i] = elements[i];
            }
            // 把添加的元素放入新数组中
            newArr[elements.length] = element;
            // 使用新数组替换久数组
            elements = newArr;
        }
        
        //取出栈顶元素
        public int pop(){
            //栈中没有元素
            if(elements.length==0){
                throw new RuntimeException("stack is empty");
            }
            //取出数组的最后一个元素
            int element = elements[elements.length-1];
            //创建一个新的数组
            int[] newArr = new int[elements.length-1];
            //把原数组中除了最后一个元素的其他元素都放在新数组中
            for(int i = 0;i<elements.length-1 ;i++){
                newArr[i] = elements[i];
            }
            //替换数组
            elements = newArr;
            //返回栈顶元素
            return element;
        }
        
        //查看栈顶元素
        public int peek(){
            return elements[elements.length-1];
        }
    
            
        //判断栈是否为空
        public boolean isEmpty(){
            return elements.length==0;
        }

测试类

  

//创建一个栈
        StackTest1 ms = new StackTest1();
        //压入数据
        ms.push(9);
        ms.push(8);
        ms.push(7);
        //出栈
        System.out.println(ms.pop());
        //查看栈顶元素
        System.out.println(ms.peek());
        //查看栈是否为空
        System.out.println(ms.isEmpty());

结果:

  

在java中集合Vector的子类就是Stack

二、队列

特点:先进先出,就跟我们日常生活的排队一样

    代码演示:也用数组演示,这里写了三个方法,入队,出队,是否为空

    

int[] elements;
    
    public QueueTest(){
        elements = new int[0];
    }
    
    //入队
    public void add(int element){
        // 创建一个新的数组
        int[] newArr = new int[elements.length + 1];
        // 把原数据复制到新数组中
        for (int i = 0; i < elements.length; i++) {
            newArr[i] = elements[i];
        }
        // 把添加的元素放入新数组中
        newArr[elements.length] = element;
        // 使用新数组替换久数组
        elements = newArr;
    }
    
    //出队
    public int poll(){
        //把数组中第0个元素取出来
        int element = elements[0];
        //创建一个新的数组
        int[] newArr = new int[elements.length-1];
        //
        for(int i = 0;i<newArr.length;i++){
            newArr[i] = elements[i+1];
        }
        //替换数组
        elements = newArr;
        return element;
        
    }
    
    //判断队列是否为空
    public boolean isEmpty(){
        return elements.length==0;
    }

测试类

  

     //创建一个队列
        QueueTest qt = new QueueTest();
        //入队
        qt.add(9);
        qt.add(8);
        qt.add(7);
        //出队
        System.out.println(qt.poll());
        //是否为空
        System.out.println(qt.isEmpty());
        System.out.println(qt.poll());
        System.out.println(qt.poll());
        System.out.println(qt.isEmpty());

结果

    

在java中,也有队列就是Queue接口,和List、Set接口并列

猜你喜欢

转载自www.cnblogs.com/StudyZhh/p/10439554.html