栈-java语言版

121 阅读2分钟

我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中, 又可以从栈中出去。 栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出 的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。

栈.png

-- API设计:

栈API.png

-- 代码:

/**
 * 栈
 * @param <T>
 */
public class Stack<T> implements Iterable<T> {
    // 记录首结点
    private Node head;
    // 记录栈中元素个数
    private int N;

    // 构造方法
    public Stack() {
        head = new Node(null,null);
        N = 0;
    }

    // 判断当前栈中元素个数是否为0
    public boolean isEmpty() {
        return N == 0;
    }

    // 获取栈中元素的个数
    public int size() {
        return N;
    }

    // 把元素t压入栈中
    public void push(T t) {
        // 构建新结点,将头结点的下一个变成新结点的下一个
        Node newNode = new Node(t,head.next);
        // 将头结点的下一个指向变成新结点
        head.next = newNode;
        // 个数+1
        N++;
    }

    // 弹出栈顶元素
    public T pop() {
        if(head.next == null) {
            // 如果栈没有元素
            return null;
        }else {
            // 要返回的元素
            Node oldNode = head.next;
            // 将栈顶元素从链表中删除
            head.next = head.next.next;
            // 个数-1
            N--;
            return oldNode.item;
        }
    }

    //==============================================================================
    // 实现for-each遍历的
    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }

    class SIterator implements Iterator<T> {
        private Node n = head;
        @Override
        public boolean hasNext() {
            return n.next != null;
        }

        @Override
        public T next() {
            n = n.next;
            return n.item;
        }
    }

    // 结点类
    class Node {
        // 存储数据
        private T item;
        // 下一个结点
        private Node next;
        // 构造方法
        public Node(T item, Node next) {
            this.item = item;
            this.next = next;
        }
    }
}

-- 测试代码:

public class StackTest {
    public static void main(String[] args) throws Exception {
        Stack<String> stack = new Stack<>();
        stack.push("a");
        stack.push("b");

        stack.push("c");
        stack.push("d");
        for (String str : stack) {
            System.out.print(str + " ");
        }
        System.out.println("-----------------------------");
        String result = stack.pop();
        System.out.println("弹出了元素:" + result);
        System.out.println(stack.size());
    }
}

-- 运行效果图:

栈效果.png

@ 以上内容属于个人笔记