最近在学习java数据结构和算法,每个重点知识我都会以 “思想原理 + 代码 + 总结” 的方式写一篇博客,方便自己以后复习,并分享给大家。如有问题,欢迎指出。
思想: 把栈看作是一个没有头结点的链表,此时只能在链表的头部进行操作插入,删除,取值等操作,不可以在中间或末尾进行操作。
代码实现,如下:
package com.guigu.stack;
import java.util.Scanner;
public class LinkedStackDemo {
public static void main(String[] args) {
//定义一个链栈
LinkedListStack linkedListStack = new LinkedListStack();
//用来接收命令
String key = "";
Scanner scanner = new Scanner(System.in);
//用来控制程序退出
boolean flag = true;
while(flag) {
System.out.println("1.push:代表进栈;");
System.out.println("2.pop:代表出栈;");
System.out.println("3.exit:退出程序;");
System.out.println("4.show:遍历栈;");
System.out.println("请输入你的命令:");
key = scanner.next();
switch(key) {
case "push":
System.out.println("请输入你的数据值:");
int value = scanner.nextInt();
DataNode dataNode = new DataNode(value);
linkedListStack.push(dataNode);
break;
case "pop":
int data = linkedListStack.pop();
System.out.println("出栈的数据为 " + data);
break;
case "exit":
flag = false;
break;
case "show":
linkedListStack.showLinkedStack();
break;
default:
System.out.println("未找到命令~~");
break;
}
}
System.out.println("程序结束~~");
}
}
/* 思想:
* 把栈看作是一个没有头结点的链表,
* 此时只能在链表的头部进行操作插入,删除,取值等操作,
* 不可以在中间或末尾进行操作。
*/
//定义一个链栈的实现类
class LinkedListStack{
private DataNode top = null;
//栈空
public boolean isEmpty() {
return top == null;
}
//进栈
public void push(DataNode dataNode) {
if(isEmpty()) {
top = dataNode;
return;
}
//声明一个辅助指针,用来存储当前top指向的节点
DataNode temp = top;
//将新的节点赋值给top
top = dataNode;
//再将temp指向的节点的next指针指向新插入节点
top.setNext(temp);
}
//出栈
public int pop() {
//判断栈是否为空
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
//temp指向当前的栈顶元素节点,即top指向的节点
DataNode temp = top;
//将top指向后一个节点
top = top.getNext();
//返回栈顶元素节点的数据
return temp.getData();
}
//遍历栈
public void showLinkedStack() {
if(isEmpty()) { //判断是否为空
System.out.println("栈为空~~");
return;
}
DataNode cur = top;
while(true) {
if(cur == null) {
break;
}
System.out.println(cur.getData());
cur = cur.getNext();
}
}
}
//定义一个数据节点的实现类
class DataNode{
private int data; //用来存储数据
private DataNode next; //指向下一个节点
public DataNode(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public DataNode getNext() {
return next;
}
public void setNext(DataNode next) {
this.next = next;
}
}
程序测试:
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
push
请输入你的数据值:
100
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
show
100
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
push
请输入你的数据值:
60
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
push
请输入你的数据值:
90
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
show
90
60
100
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
pop
出栈的数据为 90
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
push
请输入你的数据值:
70
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
show
70
60
100
1.push:代表进栈;
2.pop:代表出栈;
3.exit:退出程序;
4.show:遍历栈;
请输入你的命令:
exit
程序结束~~
总结:链栈的实现主要是把握它的实现思想,思想懂了就比较简单了。链栈相比较顺序栈而言,没有顺序栈用的多,但是如果是你存储的数据值个数变化比较大时,使用顺序栈比较好。