栈(Stack)的2种实现——数组、链表(Java)

栈的简述

栈(Stack)是一种常用的数据结构,栈只能从一端读写数据,它是一个典型的”后进先出“队列。可以操作的位置叫做栈顶,而栈底则不允许操作。

栈通常有2个关键方法:

  1. 进栈(push):将元素添加到栈队列中,成为栈顶元素。
  2. 出站(pop):将栈顶元素弹出队列。

栈通常可以通过两种方式来实现,接下来我们将自定义栈的实现。

数组来实现栈


通过数据可以实现栈,但需要注意以下几个问题:

  1. 首先,数组必须是可扩容的。
  2. 数组扩容时,我们可以采用将容量扩大一倍,当数组元素不足容量的1/4时,我们将数组容量缩小一半。
  3. Stack通常要支持泛型,但Java无法进行泛型数组的初始化,我们可以先创建一个Object数组,然后将其强转为泛型数组。

代码实现:

public class Stack<T>{
    private T[] arr;
    private int index;

    public Stack(){
        arr = (T[])new Object[1];
        index = 0;
    }
    public void push(T v){
        if (index == arr.length){
            resize(arr.length * 2);
        }
        arr[index++] = v;
    }
    public T pop(){
        if(index == 0){
            return null;
        }
        T v = arr[--index];
        arr[index] = null;
        if (index > 0 && index<=arr.length/4){
            resize(arr.length/2);
        }
        return v;
    }
    private void resize(int size){
        if (size <= 1){
            return;
        }
        T[] newArr = (T[])new Object[size];
        for (int i=0;i<index;i++){
            newArr[i] = arr[i];
        }
        arr = newArr;
    }
}

链表来实现栈


链表实现栈非常简单,我们直接来看代码:

public class Stack<T> {
    private class Node<T> {
        public Node<T> next;
        public T mValue;
        public Node(T v){
            mValue = v;
            next = null;
        }
    }
    private Node<T> mHead = null;
    public void push(T v){
        Node<T> node = new Node<>(v);
        node.next = mHead;
        mHead = node;
    }
    public T pop(){
        if (mHead == null){
            return null;
        }
        T v = mHead.mValue;
        mHead = mHead.next;
        return v;
    }
}

总结


  1. 栈(Stack)是一种常用的数据结构,栈只能从一端读写数据,它是一个典型的”后进先出“队列。可以操作的位置叫做栈顶,而栈底则不允许操作。
  2. 进栈(push):将元素添加到栈队列中,成为栈顶元素。
  3. 进栈(push):将元素添加到栈队列中,成为栈顶元素。
  4. 本文使用数组和链表分别实现了栈。

猜你喜欢

转载自blog.csdn.net/u011578734/article/details/106378539
今日推荐