JAVA数据结构——栈

82 阅读2分钟

1.首先我们知道在浏览器中有一个前进和倒退的功能,那么这个功能具体的实现算法,其实就是栈,这样一来,大家应该也知道了栈的算法特点了,没错,就是先进后出,后进先出06f39e82281ee8f3790934877baa7e5.png

2.对于栈的代码实现,方法无非就三种peek()获取栈顶元素、pop()移除栈顶元素、push()往栈顶添加元素,这样一来大家应该可以看出来了,栈顶就是栈的进行特色,那么我们直接看代码是如何实现的吧。

(1).我们首先使用数组实现栈,代码如下:

package com.example.main;

public class Stack {
    //必须声明栈的大小
    int size;
    //创建数组
    String[] stack;
    //再创建一个栈顶,没有元素时默认栈顶为-1.
    int top = -1;
    public Stack(){
        InitDate(20);
    }

    public Stack(int size){
        InitDate(size);
    }

    //可以让调用者往构造函数里面传入栈的大小参数。
    public void InitDate(int size){
        this.stack = new String[size];
        this.size = size;
    }

    //往栈中添加元素的push()方法。
    public Boolean push(String value){
        if (this.top > this.size - 1) {
            return false;
        }
        this.top++;
        this.stack[this.top] = value;
        return true;
    }

    //获取栈顶元素
    public String peek(){
        return this.stack[this.top];
    }

    //获取并删除栈顶元素
    public String pop(){
        String element = this.stack[this.top];
        this.stack[this.top] = null;
        this.size--;
        this.top--;
        return element;
    }
}

(2).那么我们还想再用链表来实现栈的结构,因为链表本身就具有无限扩充的能力,不必要计较容量是否充足。代码也是如下:

这个是创建的链表Node类。

package com.example.main;

public class Node<T> {
    private T content;
    private Node<T> next;

    public Node(T content) {
        this.content = content;
    }

    public Node(T content, Node<T> next) {
        this.content = content;
        this.next = next;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }
}

以下才是栈的实现:

package com.example.main;

public class Stack<T> {
    Node<T> stack;
    private int size = 0;
    //可以得到栈的大小。
    public int getSize(){
        return this.size;
    }

    public void push(T value){
        if (this.size == 0){
            this.stack = new Node<>(value,null);
        } else {
            this.stack = new Node<>(value,this.stack);
        }
        this.size++;
    }
    public T peek(){
        if (this.size == 0){
            return null;
        }
        return this.stack.getContent();
    }
    //在pop()方法中不需要使node的content为null,因为Java的垃圾回收机制会帮你解决掉。
    public T pop(){
        if (this.size == 0){
            return null;
        }
        Node<T> node = this.stack;
        this.stack = this.stack.getNext();
        node.setNext(null);
        return node.getContent();
    }
}

3.那么我们手搓完栈之后,在JDK里面已经帮我们封装好了一个栈类了,即如下所示: