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!