zoukankan      html  css  js  c++  java
  • 数据结构——栈

    stack,中文翻译为堆栈,其实指的是栈,heap,堆。这里讲的是数据结构的栈,不是内存分配里面的堆和栈。

    栈是先进后出的数据的结构,好比你碟子一个一个堆起来,最后放的那个是堆在最上面的。

    栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的

    线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈

    (Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。

    顺序栈

    顺序栈,顾名思义就是采用顺序表实现的的栈,顺序栈的内部以顺序表为基础,实现对元素的存取操作,当然我们还可以采用内部数组实现顺序栈,在这里我们使用内部数据

    组来实现栈

    package com.demo.stack;
    
    public class SeqStack {
    
        private int top = -1;
        private int capacity = 10;
        private int[] array;
        private int size;
        
        public SeqStack(int capacity){
            array = new int[capacity];
        }
        
        public SeqStack(){
            array = new int[this.capacity];
        }
        
        public int size(){
            return size;
        }
        
        public boolean isEmpty(){
            return this.top == -1;
        }
        
        public void push(int data){
            if(array.length == size){
                addCapacity(size*2);
            }
            array[++top] = data;
            size++;
        }
        
        public int pop(){
            if(isEmpty()){
                return -1;
            }
            size--;
            array[top] = (Integer) null;
            return array[top--];
        }
        
        public void addCapacity(int capacity){
            if(capacity < size){
                return;
            }
            int[] old = array;
            array = new int[capacity];
            for(int i=0; i<size; i++){
                array[i] = old[i];
            }
        }
    }

    链式栈

    了解完顺序栈,我们接着来看看链式栈,所谓的链式栈(Linked Stack),就是采用链式存储结构的栈,由于我们操作的是栈顶一端,因此这里采用单链表(不带头结点)

    作为基础,直接实现栈的添加,获取,删除等主要操作即可。

    package com.demo.node;
    
    public class Node {
    
        public int data;
        public Node next = null;
        
        public Node(int data){
            this.data = data;
        }
        
        public Node(int data, Node node){
            this.data = data;
            this.next = node;
        }
    }
    package com.demo.stack;
    
    import com.demo.node.Node;
    
    public class LinkedStack {
    
        private Node top;
        private int size;
        
        public LinkedStack(){
            this.top = null;
        }
        
        public int size(){
            return this.size;
        }
        
        public void push(int data) throws Exception{
            if(this.top == null){
                this.top = new Node(data);
            }else{
                Node p = new Node(data,this.top);
                top = p;
            }
            size++;
        }
        
        public int pop(){
            int data = top.data;
            top = top.next;
            size--;
            return data;
        }
    }
  • 相关阅读:
    反思 自学困境自我剖析、习惯的惯性与维持
    Java IO 节点流 FileInput/OutputStream
    Java IO 理解流的概念
    spring boot2.1读取 apollo 配置中心1
    saga+.net core 分布式事务处理
    npm install 报错 ECONNREFUSED
    读书笔记: Microsot .NET企业级应用架构设计
    Dockerfile 设置语言包
    Centos环境下,执行gulp,显示执行成功,但找到不生成的压缩文件
    Jenkins Pipeline shell脚本用svn_revision当做系统版本号
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/8445383.html
Copyright © 2011-2022 走看看