java链表实现栈的功能,重要的解释写在注释中。
import java.util.Scanner;
public class StackDemo {
public static void main(String[] args) {
LinkedStackDemo stack = new LinkedStackDemo();
String key = "";
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while (loop) {
System.out.println("show:显示栈");
System.out.println("exit:退出程序");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("请输入选择:");
key = scanner.next();
switch (key) {
case "show":
stack.print();
break;
case "push":
System.out.println("请输入一个数:");
int value = scanner.nextInt();
stack.push(value);
break;
case "pop":
try {
int res = stack.pop();
System.out.println("出栈:" + res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
}
}
class LinkedStackDemo {
LinkedStack head;//设置头结点,保证头结点一直在栈顶
public LinkedStackDemo() {
head = new LinkedStack();
}
//判断是否为空
public boolean isEmpty() {
if (head.next == null) {
System.out.println("链表为空!");
return true;
}
return false;
}
//进栈
public void push(int num) {
LinkedStack linkedStack = new LinkedStack();
if (isEmpty()) {
linkedStack.num = num;
head.next = linkedStack;
} else {
linkedStack.num = num;//给新加入的节点的数据域赋值
linkedStack.next = head.next;//让新加入的节点指向头节点的next域,
head.next = linkedStack;//将头结点向栈顶移动
}
}
//出栈
public int pop() {
int value = 0;
if (isEmpty()) {
System.out.println("栈已为空!");
throw new RuntimeException("栈为空");
}
value = head.next.num;
head.next = head.next.next;
return value;
}
//从栈顶开始打印栈中存在的元素(并不出栈)
public void print() {
LinkedStack temp = head;//借用一个临时节点
if (temp.next == null) {
System.out.println("栈为空!");
}
while (temp.next != null) {
System.out.print(temp.next.num + " ");
temp = temp.next;
}
}
}
class LinkedStack {
int num;//数据域
LinkedStack next;//指针域
public LinkedStack() {
}