zoukankan      html  css  js  c++  java
  • 栈和队列的java简单实现

    栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下:

    public class Stack<T> {
        private Object[] data;//存储数据
        private int top;//表示栈顶元素
        public Stack(){
            data = new Object[100];//为了说明原理随意指定
            top =-1;
        }
        public synchronized void  put(T t){    //压栈
           data[data.length] = t;
            top++;
        }
        public synchronized T pop(){    //出栈
            if(top<0){
                return null;
            }
            T t = (T) data[top];
            top --;
            return t;
        }
    }

     这只是我自己的Java实现只说明原理,但实际在java中是利用vector来存储数据的,我们知道vector其实是一个线程安全的ArrayList,而ArrayList的底层也是一个数组,所以原理上大同小异

      队列:队列其实就是我们生活中的排队现象,先进入的先出,后进入的后出,代码实现如下:

      

    public class Queue<T> {
        private  Object[] data;  //存储数据
        private int head; //
        private int tail;   //
    
        public Queue(){
            data = new Object[100];//为了说明原理随意指定
            head =1;
            tail =1;
        }
        public void put(T t){
            data[tail] =t;
            tail++;
        }
        public T get(){
            T t =(T) data[head];
            head ++;
            return t;
        }
    }

    如上所示,也只是说明原理,其实在java jdk中也有许多不同的对列,并且对列可以由数组实现,也可以由链表实现,下面介绍链表

    链表是一个类似于现实中串项链的数据结构,前一个数据指向后一个数据,当然也可以后一个数据指向前一个数据,这就是双向链表,这里不做讨论

    public class MyNode<T> {
        private Node<T> headNode ;
        public MyNode(T t){
            headNode = new Node<>(t,null);
        }
        public MyNode(){
    
        }
        private static class Node<E> {
            Object e;
            Node<E> next;
            Node(E element, Node<E> next) {
                this.e = element;
                this.next = next;
            }
        }
        public void put(T t){
            if(headNode==null){
                headNode = new Node<>(t,null);
            }else {
                headNode= new Node<>(t,headNode);
            }
        }
        public T get(int index){
            Node node = headNode;
            for(int i=2;i<index;i++){
                node= node.next;
            }
            T t = (T) node.e;
            return t;
        }
    }

      

      以上就是用Java实现的简单链表,还有双向链表是一个元素指向前一个元素和后一个元素,原理大概相同,这里可以看书链表中取固定位置的数据是非常麻烦的,必须从第一个开始依次查找,这也就是linklist不用for(int i=0;i++;i<size())遍历的原因,因为linklist的底层就是通过链表来实现的

  • 相关阅读:
    CefSharp应用——High DPI问题
    CefSharp应用——程序输出
    CefSharp应用——环境搭建
    QTTabBar加载项被禁用
    OCR 中文汉字识别,可用于文档识别,身份证识别,名片识别,采用字库+卷积神经网络
    springboot中Thymeleaf和Freemarker模板引擎的区别
    一种mysql 实现用户前两条语句方案
    Elasticsearch java.lang.ClassNotFoundException: org.elasticsearch.common.transport.InetSocketTransportAddress
    版本6.2.4的elasticsearch包里面没有InetSocketTransportAddress
    ES spring数据JPA&spring data elasticsearch;找不到类型的属性索引
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8637913.html
Copyright © 2011-2022 走看看