【數據結構】棧之鏈式棧

public class LinkStack<T> {

    // 定義一個內部類Node, Node實例表明鏈棧的節點
    private class Node {
        // 保存節點的數據
        private T data;
        // 指向下個節點的引用
        private Node next;
        // 無參數的構造器
        public Node() {
        }
        // 初始化所有屬性的構造器
        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
    // 保存該鏈棧的棧頂元素
    private Node top;
    // 保存該鏈棧中已包含的節點數
    private int size;
    // 建立空鏈棧
    public LinkStack() {
        // 空鏈棧,top的值爲null
        top = null;
    }
    // 以指定數據元素來建立鏈棧,該鏈棧只有一個元素
    public LinkStack(T element) {
        top = new Node(element, null);
        size++;
    }
    // 返回鏈棧的長度
    public int length() {
        return size;
    }
    // 進棧
    public void push(T element) {
        // 讓top指向新建立的元素,新元素的next引用指向原來的棧頂元素
        top = new Node(element, top);
        size++;
    }
    // 出棧
    public T pop() {
        Node oldTop = top;
        // 讓top引用指向原棧頂元素的下一個元素
        top = top.next;
        // 釋放原棧頂元素的next引用
        oldTop.next = null;
        size--;
        return oldTop.data;
    }
    // 訪問棧頂元素,但不刪除棧頂元素
    public T peek() {
        return top.data;
    }
    // 判斷鏈棧是否爲空棧
    public boolean empty() {
        return size == 0;
    }
    // 清空鏈棧
    public void clear() {
        top = null;
        size = 0;
    }
    public String toString() {
        if (empty()) {
            return "[]";
        } else {
            StringBuilder sb = new StringBuilder("[");
            for (Node current = top; current != null; current = current.next) {
                sb.append(current.data.toString() + ", ");
            }
            int len = sb.length();
            return sb.delete(len - 2, len).append("]").toString();
        }
    }
}
public class LinkStackTest {
    public static void main(String[] args) {
        LinkStack<String> stack = new LinkStack<String>();
        stack.push("aaaa");
        stack.push("bbbb");
        stack.push("cccc");
        stack.push("dddd");
        System.out.println("初始化後列表元素:" + stack.toString());
        System.out.println("訪問棧頂元素:" + stack.peek());
        System.out.println("第一次彈出棧頂元素:" + stack.pop());
        System.out.println("第一次pop以後的棧元素:" + stack.toString());
        System.out.println("第二次彈出棧頂元素: " + stack.pop());
        System.out.println("兩次pop以後的棧元素:" + stack.toString());
    }
}
相關文章
相關標籤/搜索