Java新手入门200例126之用单向链表实现栈

本文是作者编程界明世隐为Java初学者整理的200例之一,通过实际操作讲解如何使用单向链表实现栈。文章包含元素类定义、接口设计、自定义栈及测试过程,帮助读者提升编码技巧和熟练度。
摘要由CSDN通过智能技术生成

作者简介

作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!

在这里插入图片描述

引言

很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢?
其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大佬的路上一去不复返(切记要亲手练习哦)!

导航

✪ Java小白入门200例系列目录索引
◄上一篇【125】用C3P0连接Mysql实例
►下一篇【127】待更新

热门专栏推荐

【1】Java小游戏(俄罗斯方块、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】Idea从零到精通

定义元素类

定义一个Node类,用来作为栈的元素对象。

package stack;
//定义一个Node,用来作为栈的元素对象
public class Node<T> {
		T data;//用来存储数据
		Node prev;//上一个元素
		public Node(T data) {
			this.data = data;
		}
	}

定义接口

package stack;

/**
 * 栈操作定义
 */
public interface Stack<T> {
	/* 判空 */
	Boolean isEmpty();
	/* 清空栈 */
	void clear();
	/* 弹栈 */
	T pop();
	/* 入栈 */
	Boolean push(T data);
	/* 栈的长度 */
	int length();
	/* 查看栈顶的元素,但不移除它 */
	T peek();
	/* 返回对象在栈中的位置 */
	int search(T data);

	/*	获取下一个元素 */
	T next();
}

自定义栈

package stack;

//自定义栈,单向链表方式
public class MyStack<T> implements Stack<T> {
	private Node<T> top;//定义栈顶
	private int size;//栈的长度
	private Node<T> tmp = null;//临时元素,用来迭代

	@Override
	public Boolean isEmpty() {//是否为空栈
		return size == 0;
	}

	@Override
	public void clear() {//清空栈
		top = null;
		size = 0;
	}

	@Override
	public T pop() {//弹出栈
		T topValue = null;
		if (top != null) {
			topValue = top.data;
			Node oldTop = top;
			top = top.prev;
			oldTop.prev = null;
			size--;
		}
		return topValue;
	}

	@Override
	public Boolean push(T data) {//入栈
		Node oldTop = top;
		top = new Node(data);
		top.prev = oldTop;
		size++;
		return true;
	}

	@Override
	public int length() {
		return size;
	}

	@Override
	public T peek() {
		T topValue = null;
		if (top != null) {
			topValue = top.data;
		}
		return topValue;
	}

	@Override
	public int search(T data) {//搜索
		int index = -1;
		Node tmp = top;
		for (int i = size - 1; i > -1; i--) {
			if (tmp.data.equals(data)) {
				index = i;
				break;
			} else {
				tmp = tmp.prev;
			}
		}
		tmp = null;
		return index;
	}

	/**
	 * 获取指定元素
	 */
	public T getElement(int index) {
		Node<T> tmp = top;
		for (int i = 0; i < size; i++) {
			if (i == index) {
				return tmp.data;
			}
			tmp = tmp.prev;
		}
		return null;
	}

	@Override
	//迭代元素用
	public T next() {
		T data = null;
		if (tmp == null) {
			return null;
		}
		data = tmp.data;
		tmp = tmp.prev;

		return data;
	}

	//迭代时先调用此方法回到栈顶
	public void goTop() {
		tmp = top;
	}

	@Override
	public String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("链表栈的内容是:[");
		Node tmp = top;
		for (int i = 0; i < size - 1; i++) {
			buffer.append(tmp.toString() + ",");
			tmp = tmp.prev;
		}
		tmp = null;
		buffer.append("]");
		buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
		return super.toString();
	}
}

测试类

package stack;

public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        //入栈
        myStack.push("明世隐");
        myStack.push("小鲁班");
        myStack.push("公孙离");
        myStack.push("后裔");
        myStack.push("狄仁杰");

        System.out.println("栈的长度是:"+myStack.length());
        int index = myStack.search("后裔");
        System.out.println("查找元素的下标是:"+index);
        //长度
        int len = myStack.length();
        //回到栈顶,确保从栈顶循环下来
        myStack.goTop();
        //开始循环
        for (int i=0;i<len;i++){
            System.out.println("元素:"+myStack.next());
        }

        //查看栈顶元素
        System.out.println("栈顶的元素是:"+myStack.peek());
        //出栈,栈顶被出
        System.out.println("出栈的元素是:"+myStack.pop());
        System.out.println("出栈后栈顶的元素是:"+myStack.peek());

        //判断栈是否有元素
        System.out.println("栈是否为空:"+myStack.isEmpty());
        //清空栈
        System.out.println("=====清空栈======");
        myStack.clear();
        //判断栈是否有元素
        System.out.println("栈是否为空:"+myStack.isEmpty());
    }
}

运行结果:

栈的长度是:5
查找元素的下标是:3
元素:狄仁杰
元素:后裔
元素:公孙离
元素:小鲁班
元素:明世隐
栈顶的元素是:狄仁杰
出栈的元素是:狄仁杰
出栈后栈顶的元素是:后裔
栈是否为空:false
清空栈
栈是否为空:true

小结

这节总结了“ 单向链表实现栈 ”,希望能对大家有所帮助,请各位小伙伴帮忙 【点赞】+【收藏】+ 【评论区打卡】, 如果有兴趣跟小明哥一起学习Java的,【关注一波】不迷路哦。

评论区打卡一波让我知道你,明哥会持续关注你的学习进度哦!

导航

✪ Java小白入门200例系列目录索引
◄上一篇【125】用C3P0连接Mysql实例
►下一篇【127】待更新

热门专栏推荐

【1】Java小游戏(俄罗斯方块、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】Idea从零到精通

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程界小明哥

请博主喝瓶水,博主持续输出!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值