Java数据结构和算法之链栈

本文详细介绍了一种使用链表实现栈的Java数据结构。通过具体代码示例,展示了链栈的基本操作,包括进栈、出栈、遍历及检查栈是否为空。文章提供了完整的程序测试流程,便于理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习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
程序结束~~

总结:链栈的实现主要是把握它的实现思想,思想懂了就比较简单了。链栈相比较顺序栈而言,没有顺序栈用的多,但是如果是你存储的数据值个数变化比较大时,使用顺序栈比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值