数据结构——栈

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;
    }
}

 

posted @ 2018-02-12 19:34  取什么昵称呢  阅读(168)  评论(0编辑  收藏  举报