利用单链表实现栈的操作,类中包括入栈(push),出栈(pop),显示栈中内容(show)的方法。
package com.atguigu.stack;
import java.util.Scanner;
import java.util.Stack;
public class LinkedToStackDemo {
public static void main(String[] args) {
//测试一把;
LinkedToStack linkedToStack = new LinkedToStack(4);
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":
System.out.println("栈中的数据为·······");
linkedToStack.show();
break;
case "push":
int value_push = scanner.nextInt();
LinkedNode value = new LinkedNode(value_push);
linkedToStack.push(value);
break;
case "pop":
int value_pop;
linkedToStack.pop();
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
}
}
class LinkedToStack {
private int maxSize;//栈的大小
private int top = -1;//top表示栈顶,初始化为-1
LinkedNode head = new LinkedNode(0);//定义一个头节点
//构造器
public LinkedToStack(int maxSize) {
this.maxSize = maxSize;
}
//栈满
public boolean isFull() {
return top == maxSize - 1;
}
//栈空
public boolean isEmpty() {
return top == -1;
}
//入栈
public void push(LinkedNode value) {
LinkedNode temp = head;
if (isFull()) {
System.out.println("栈已满,不能再加入········");
return;
}
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = value;
top++;
}
//出栈
public int pop() {
LinkedNode temp = head;
int value;
if (isEmpty()) {
throw new RuntimeException("栈空,不能再取数据");
}
while (true) {
if (temp.next.next == null) {
break;
}
temp = temp.next;
}
top--;
System.out.printf("出栈元素是%d:\n", temp.next.value);
temp.next = null;
return temp.value;
}
//显示
public void show() {
if (head.next == null) {
return;
}
Stack<LinkedNode> stack = new Stack<LinkedNode>();
LinkedNode cur = head.next;
while (cur != null) {
stack.push(cur);
cur = cur.next;
}
//将栈中元素Pop出
while (stack.size() > 0) {
System.out.printf("No %d:", top);
top--;
System.out.println(stack.pop());
}
}
}
//定义LinkedNode,每个LinkedNode 对象就是一个节点
class LinkedNode {
public LinkedNode next;
public LinkedNode pre;
public int value;
public LinkedNode(int value) {
this.value = value;
}
//为了显示方法,我们重写toString
@Override
public String toString() {
return "LinkedNode [no=" + value + "]";
}
}