# 链栈(LinkedStack)

```java
public class LinkStack {

    /**
     * 定义链栈的结点
     * Object类型的数据域
     * Node类型的指针域
     * @author MWL
     */
    private class Node{
        Object data;
        Node next;

        public Node(){}

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

    private Node top;   //栈顶元素
    private int size;   //当前栈的大小

    /**
     * 创建空链栈
     */
    public LinkStack() {
        top = null;
    }

    /**
     * 以data数据元素创建链式栈
     * @param data
     */
    public LinkStack(Object data){
        top = new Node(data,null);
        size++;
    }

    /**
     * 判断链栈是否为空栈
     * @return
     */
    public boolean isEmpty(){
        return size == 0 ? true : false;
    }

    /**
     * 返回链栈的长度
     * @return
     */
    public int length(){
        return size;
    }

    /**
     * 压栈(入栈)
     * @param data
     */
    public void push(Object data){

        //更新头节点
//      System.out.print("压栈成功:" + data + "指向->" + top + "\t");
        // 让top指向新创建的元素，新元素的next引用指向原来的栈顶元素
        top = new Node(data, top);
        size++;

    }

    /**
     * 出栈
     * @return
     */
    public Object pop(){

        if(isEmpty()) {
            System.out.println("目前是空栈，无法进行出栈!");
            return "error!";
        }
        Node temp = top;    
        // 更新头结点
        top = top.next;
        // 释放原栈顶元素的next引用，删除指针指向
        temp.next = null;
        size--;
        return temp.data;
    }

    /**
     * 访问栈顶元素
     * @return
     */
    public Object peek(){
        if(top != null){
            return top.data;
        }
        return "空栈，无栈顶元素!";
    }

    /**
     * 遍历栈并打印栈内元素
     */
    public void displayStack(){
        while(top != null){
            System.out.println(top.data + "\t");
            top=top.next;
        }
    }
    /**
     * 清空栈
     */
    public void clear(){
        top = null;
        size = 0;
    }

    public static void main(String[] args) {

        LinkStack stack = new LinkStack("how");
        stack.push(3);
        stack.push("hello");
        stack.push('A');
//      stack.displayStack();
        System.out.println("++++++++++++");
        System.out.println("当前栈的长度为：" + stack.length());
        System.out.println("当前栈是否为空：" + stack.isEmpty());
        System.out.println("当前栈的栈顶元素为：" + stack.peek());
        System.out.println("第一次出栈时的栈顶元素：" + stack.pop());
        System.out.println("============");
        System.out.println("出栈后的栈顶元素：" + stack.peek());
        System.out.println("第二次出栈时的栈顶元素：" + stack.pop());
        System.out.println("第三次出栈时的栈顶元素：" + stack.pop());
        System.out.println("第四次出栈时的栈顶元素：" + stack.pop());
        System.out.println("************");
    }
}

程序运行结果如下：
++++++++++++
当前栈的长度为：4
当前栈是否为空：false
当前栈的栈顶元素为：A
第一次出栈时的栈顶元素：A
============
出栈后的栈顶元素：hello
第二次出栈时的栈顶元素：hello
第三次出栈时的栈顶元素：3
第四次出栈时的栈顶元素：how
************

```
