zoukankan      html  css  js  c++  java
  • 栈与队列简介

    栈与队列和数组、链表、树这几种数据结构不太一样。栈与队列主要是做为程序员的工具来使用,它们主要做为构思算法的辅助工具,而不是完全的数据存储工具。

    它们的生命周期比数组那些要短得多,在程序执行期间它们才会被创建,任务执行完就会被销毁。

    一 栈

    栈是一种只能在一端进行插入和删除数据的数据结构,这一端被称为栈顶(top)。其特点简单来讲就是先进后出。栈的主要机制可以用数组来实现,当然也可以用链表来实现。

    用数组实现栈,并完成常用操作——出栈、入栈、查看元素(只能查看栈顶元素)、判断栈是否为空等操作。

    public class StackTest {
    	
        private long[] arr;
        // 栈顶
        private int top;
    
        public StackTest(){
            arr = new long[10];
            top = -1;
        }
        public StackTest(int maxsize){
            arr = new long[maxsize];
            top = -1;
        }
    
        /**
         * 添加数据
         * @param value
         */
        public void push(int value){
            arr[++top] = value;
        }
    
        /**
         * 移除数据
         * @return
         */
        public long pop() {
            return arr[top--];
        }
    
        /**
         * 查看数据
         * @return
         */
        public long peek(){
            return arr[top];
        }
        public boolean isEmpty(){
            return top == -1;
        }
    
        /***
         * 判断是否满了
         * @return
         */
        public boolean isFull(){
            return top == arr.length-1;
        }
    }
    

    栈的所有操作复杂度都为O(1),栈的操作不依赖栈中元素大小,栈不需要移动和比较操作。

    二 队列

    队列的特点是先进先出。队列也是用数组来实现。

    用数组实现队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。

    public class QueueTest {
    
        private long[] arr;
        // 有效数据的大小
        private int elements;
        // 队头
        private int front;
        // 队尾
        private int end;
    
        public QueueTest(){
            arr = new long[10];
            elements = 0;
            front = 0;
            end = -1;
        }
    
        public QueueTest(int maxsize){
            arr = new long[maxsize];
            elements = 0;
            front = 0;
            end = -1;
        }
    
        /**
         * 插入数据
         * @param value
         */
        public void insert(long value){
            arr[++end] = value;
            elements++;
        }
    
        /**
         * 删除数据
         * @return
         */
        public long remove(){
            elements--;
            return arr[front++];
        }
    
        /**
         * 查看数据,从对头查看
         * @return
         */
        public long peek(){
            return arr[front];
        }
    
        /**
         * 判断是否为空
         * @return
         */
        public boolean isEmpty(){
            return elements == 0;
        }
    
        public boolean isFull(){
            return elements == arr.length;
        }
    }
    

    队列的插入、删除等操作的复杂度都为O(1)。

    三 优先级队列

    优先级队列和普通队列一样,也是一个队头,一个队尾,从队头移除元素,优先级队列中,数据项是有序的,这样插入数据的时候就会根据某种规则去比较,然后插入到队列合适的位置。因此,优先级队列插入的复杂度为O(N),删除和查看元素的复杂度为O(1)。

    用数组实现优先级队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。

    public class FirstQueueTest {
    
        private long[] arr;
        // 有效数据的大小
        private int elements;
        // 队头
        private int front;
        // 队尾
        private int end;
    
        public FirstQueueTest(){
            arr = new long[10];
            elements = 0;
            front = 0;
            end = -1;
        }
    
        public FirstQueueTest(int maxsize){
            arr = new long[maxsize];
            elements = 0;
            front = 0;
            end = -1;
        }
    
        /**
         * 插入数据
         * @param value
         */
        public void inser(long value){
            if(elements == 0){
                arr[++end] = value;
                elements++;
            }else{
                // 按某种规则进行比较,这里使用value的大小比较,按从小到大排序
                for(int i = elements-1;i>=0;i--){
                    if(value<arr[i]){
                        arr[i+1] = arr[i];
                        arr[i] = value;
                    }else{
                        arr[i+1] = value;
                        break;
                    }
                }
                elements++;
                end++;
            }
        }
    
        /**
         * 删除数据
         * @return
         */
        public long remove(){
            elements--;
            return arr[front++];
        }
    
        /**
         * 查看数据,从对头查看
         * @return
         */
        public long peek(){
            return arr[front];
        }
    
        /**
         * 判断是否为空
         * @return
         */
        public boolean isEmpty(){
            return elements == 0;
        }
    
        public boolean isFull(){
            return elements == arr.length;
        }
    }
    

    四 总结

    1. 栈的特点是先进后出,栈只能查看栈顶的一个元素
    2. 队列的特点是先进先出,只能查看队头的一个元素
    3. 优先级队列插入一条元素,平均需要移动2/N个元素,因此插入的复杂度为O(N)
    4. 栈和队列,可以用数组实现,也可以用其他数据结构实现
    5. 栈和队列是为了完成某些工作,手动构造的数据结构

    点关注、不迷路

    如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

    如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。

    如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!

  • 相关阅读:
    【Go语言系列】2.3、Go语言基本程序结构:变量及常量
    【Go语言系列】2.2、Go语言基本程序结构:关键字与标识符
    【Go语言系列】2.1、Go语言基本程序结构:注释
    【Go语言系列】第三方框架和库——GIN:快速入门
    【Go语言系列】第三方框架和库——GIN:GIN介绍
    【Go语言系列】1.4、GO语言简介:第一个Go语言程序
    【Go语言系列】1.3、GO语言简介:Go语言开发的知名项目
    【Go语言系列】1.2、GO语言简介:哪些大公司正在使用Go语言
    【Go语言系列】1.1、GO语言简介:什么是GO语言
    CentOS自行编译升级Git
  • 原文地址:https://www.cnblogs.com/zhixie/p/13743192.html
Copyright © 2011-2022 走看看