一、栈

在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。如同我们往箱子里放东西,先放进去的在最底下,后放进去的在上面,拿东西的时候肯定先拿上面的,之后才能拿下面的。栈其实就是一个后进先出的线性表。

假设给定栈 S=(a0,a1,…,an-1),则称 a0 为栈底,an-1 为栈顶。进栈则按照 a0,a1,…,an-1 的顺序进行进栈;而出栈的顺序则需要反过来,按照“后存放的先取,先存放的后取”的原则进行,则 an-1 先退出栈,然后 an-2 才能够退出,最后再退出 a0。在实际编程中,可以通过两种方式来实现:使用数组的形式来实现栈,这种栈也称为静态栈;使用链表的形式来实现栈,这种栈也称为动态栈。

java先进后出数据结构是 后进先出 数据结构_java先进后出数据结构是

二、栈的代码实现

1.静态栈

根据顺序存储结构来写的,底层是由数组来实现。所以不需要定义节点。

public class SqStack {
    Object[] stack; //对象数组,静态栈是用数组来实现的
    final int defaultSize = 10; //默认长度
    int top; //栈顶位置(的一个下标)
    int maxSize; //最大长度

    //无参构造方法:默认长度
    public SqStack() {
        init(defaultSize);
    }
    //带参构造方法:最大长度
    public SqStack(int size) {
        init(size);
    }
    public void init(int size) {
        this.maxSize = size;
        top = 0;
        stack = new Object[size];
    }
    //获取栈顶元素
    public Object getTop() throws Exception {
        if (isEmpty()) {
            throw new Exception("栈为空!");
        }
        return stack[top - 1];
    }
    //判断栈是否为空
    public boolean isEmpty() {
        return top == 0;
    }
    //入栈操作
    public void push(Object obj) throws Exception {
        //首先判断栈是否已满
        if (top == maxSize) {
            throw new Exception("栈已满!");
        }
        stack[top] = obj;
        top++;
    }
    //出栈操作
    public Object pop() throws Exception {
        if (isEmpty()) {
            throw new Exception("栈空!");
        }
        top--;
        return stack[top];
    }
}

2.动态栈

动态栈(链式栈)就需要定义节点了,因为链式栈的每一个节点要存的信息比较多,比如当前节点的数据值,还有下一个节点的地址。

首先,定义一个节点对象:

public class Node {
    Object element; //数据
    Node nextNode;      //下一个节点的指针
    //头结点的构造方法
    public Node(Node nextNode) {
        this.nextNode = nextNode;
    }
    //非头结点的构造方法
    public Node(Object obj, Node nextNode) {
        this.element = obj;
        this.nextNode = nextNode;
    }

    public Object getElement() {
        return element;
    }

    public void setElement(Object element) {
        this.element = element;
    }

    public Node getNextNode() {
        return nextNode;
    }
}

然后,定义栈的主体:

public class LinkStack {
    Node head;  //栈顶指针
    int size;  //结点的个数

    public LinkStack() {
        head = null;
        size = 0;
    }
    //取得栈顶元素
    public Object getTop() throws Exception {
        return head.getElement();
    }
    //判断栈是否为空
    public boolean isEmpty() {
        return head == null;
    }
    //入栈
    public void push(Object obj) throws Exception {
        head = new Node(obj, head);
        size++;//大小增加一个
    }
    //出栈
    public Object pop() throws Exception {
        if (isEmpty()) {
            throw new Exception("栈为空!");
        }
        Object obj = head.getElement();
        head = head.getNextNode();//将栈顶指针指向下一个
        size--;//大小减小一个
        return obj;
    }
}