[JAVA]單向鏈接串列模擬棧

Imitate Stack by LinkedList

import java.util.Scanner;

public class Test {

  public static void main(String[] args) {
    SingleLinkedListStack singleLinkedListStack = new SingleLinkedListStack(5);

    System.out.println("輸入show,顯示棧中所有值");
    System.out.println("輸入push,將值加入棧頂");
    System.out.println("輸入pop,從棧頂取出值");
    System.out.println("輸入exit,退出程式");
    System.out.println("請輸入一個指令~~");
    Scanner scanner = new Scanner(System.in);
    boolean shouldBreak = false;

    while(scanner.hasNext()) {
      switch(scanner.next()) {
        case "show":
          singleLinkedListStack.show();
          break;
        case "push":
          System.out.println("請輸入一個數字!");
          int num = scanner.nextInt();
          singleLinkedListStack.push(num);
          break;
        case "pop":
          try {
            int popVal = singleLinkedListStack.pop();
            System.out.printf("本次出棧的數字:%d\n", popVal);
          } catch (Exception e) {
            System.out.println(e.getMessage());
          }
          break;
        case "exit":
          scanner.close();
          shouldBreak = true;
          break;
      }
      if(shouldBreak) break;
    }
  }
}

/**
 * 新建類別(SingleLinkedListStack )模擬棧(Stack)
 */
class SingleLinkedListStack {
  private NumberNode head;
  private int size;
  int node_nums;
  private NumberNode temp;


  public SingleLinkedListStack(int size) {
    // if stack is empty, top = -1
    this.head = new NumberNode(-1);
    // stack size
    this.size = size;
    // node nums start from 0
    this.node_nums = 0;
  }

  /**
   * Stack is empty
   * @return
   */
  public boolean isEmpty() {
    return node_nums == 0;
  }

  /**
   * Stack is full
   * @return
   */
  public boolean isFull() {
    return size > 0 && size == node_nums;
  }

  /**
   * 入棧Push
   * @param number
   */
  public void push(int number) {
    if (isFull()) {
      System.out.println("棧已滿,無法新增資料!");
      return;
    }
    NumberNode cur = new NumberNode(number);
    // push a number to stack then node_nums += 1
    node_nums++;
    cur.setNext(head.getNext());
    head.setNext(cur);
  }

  /**
   * 出棧Pop
   * @return
   */
  public int pop() {
    if (isEmpty()) {
      throw new RuntimeException("棧已空,沒有資料!");
    }
    NumberNode cur = head.getNext();
    NumberNode next = cur.getNext();
    //pop out
    int value = cur.getNumber();
    // pop a number from stack then node_nums -= 1
    node_nums--;
    // cut cur node off from LinkedList
    head.setNext(next);
    return value;
  }

  /**
   * show left nodes
   */
  public void show() {
    if (isEmpty()) {
      System.out.println("棧已空,沒有資料!");
    }
    NumberNode temp = head.getNext();
    int i = 0;
    while(temp != null) {
      System.out.printf("stack[%d] = %d\n", i++, temp.getNumber());
      temp = temp.getNext();
    }
  }

}

/**
 * 新建類別NumberNode
 */
class NumberNode {
  private int number;
  private NumberNode next;

  public NumberNode(int num) {
    this.number = num;
  }

  public int getNumber() {
    return number;
  }

  public NumberNode getNext() {
    return next;
  }

  public void setNext(NumberNode next) {
    this.next = next;
  }

  @Override
  public String toString() {
    final StringBuilder sb = new StringBuilder("NumberNode{");
    sb.append("number=").append(number);
    sb.append('}');
    return sb.toString();
  }
}

如有敘述錯誤,還請不吝嗇留言指教,thanks!