package com.ncst.stack;

/**
 * @author i
 * @create 2019/12/19 20:56
 * @Description 基于链表实现栈
 */
public class StackBasedOnLinkedList<T>{

    private Node top;//设置一个top 用来标记栈顶

    //出栈
    public void push(int value) {
        Node newNode = new Node(value, null);
        if (top == null) {
            top = newNode;
            return;
        }
        newNode.next = top;//将newNode的next设置为top
        top = newNode;//将newNode设置为栈顶结点
    }

    //入栈
    public T pop(){
        if (top == null){
            throw  new NullPointerException("statck is empty!");
        }
        T value = (T) top.data;
        top = top.next;
        return value;
    }

    //打印
    public void printfAll(){
        if (top == null){
            return;
        }

        Node cur = top;
        while (cur!=null){
            System.out.print(cur.data+",");
            cur = cur.next;
        }
    }

    public static void main(String[] args) {
        StackBasedOnLinkedList s = new StackBasedOnLinkedList();
        s.push(1);
        s.push(2);
        s.push(3);

        System.out.println(s.pop());
        System.out.println(s.pop());
        System.out.println(s.pop());

    }

    //创建节点
    private class Node<T> {
        private T data;
        private Node next;

        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }

        public T getData() {
            return data;
        }

        public Node getNext() {
            return next;
        }

    }

}