使用链表来实现数据结构Stack

stack 栈是一种后进先出,先进后出的数据结构,在我们的日常使用中非常实用和常见,需要算法的实现借助stack能够很方便的实现,比如二叉树的遍历,图的深度优先算法等等,stack在计算机内部应用的十分广泛,同时在java中非常重要和广泛 比如jvm中的就有stack区等等。

为了使用链表来实现stack ,我们需要知道实现stack主要的难点在哪里,

  1. pop操作,push操作,在链表中对队尾元素的添加,删除是方便的,以单向链表为例,只需要找出要操作结点的前一个结点即可完成操作。
  2. 找出要操作结点的前一个结点, 通过一个while遍历即可难度也不大
  3. 展示stack

思路实现
1.我们需要一个临时指针,为了方便我们操作,这个指针帮我们指向最后一个结点的前一个结点
此时我们对这个链表在尾部的增删就变得是非方便

2.寻找最后节点的前一个结点

  • 通过分析,在对链表的操作中,头结点是一个非常特殊的存在,当只有一个头结点时,它既是最后一个结点,也是第一个结点,对push操作而言,就不需要要到前一个结点了,直接插入即可。

代码实现

package stack;/** @Author: 云萧YYY @DateTime: 2021/08/05 @Description: 链表模拟stack */
public class LinkedStack {private Node head;public LinkedStack() {head = new Node(0, null);}public void push(int value) {Node node = new Node(value, null);// 开始第一个结点if (head.getNext()==null){head.setNext(node);return;}// 获取最后一个结点的前一个结点Node point = endPointPrevious();point.getNext().setNext(node);}public int pop() {if (head == null) {throw new RuntimeException("stack is empty");}Node previous = endPointPrevious();int value = previous.getNext().getValue();//previous.setNext(null);return value;}/*** ,返回最后一个结点的前一个结点** @return*/public Node endPointPrevious() {Node temp = head;while (true) {// 头结点if (head.getNext() == null) {break;}if (temp.getNext().getNext() == null) {//        temp = temp.getNext();break;}temp=temp.getNext();}return temp;}public void show() {if (head.getNext() == null) {System.out.println("stack  is  empty");}// 倒叙输出for (int size = size() - 1; size > 0; size--) {//System.out.print(getPointByIndex(size).getValue() + ",");}}public Node getPointByIndex(int index) {if (index < 0 || index > size()) {throw new RuntimeException("index is bad");}Node temp = head;for (int i = 0; i < index; i++) {temp = temp.getNext();}return temp;}public int size() {if (head.getNext() == null) {return 0;}int count = 0;Node temp = head;while (temp != null) {count++;temp = temp.getNext();}return count;}
}

测试用例

public class test {public static void main(String[] args) {////ArrayStack stack = new ArrayStack(5);LinkedStack stack=new LinkedStack();stack.push(5);stack.push(4);stack.push(3);stack.show();System.out.println();int val = stack.pop();int val1 = stack.pop();int val2= stack.pop();System.out.println(val);stack.show();}
}

测试结构

使用链表实现栈stack相关推荐

  1. 用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

    一,用结点实现链表LinkedList,不用换JavaAPI的集合框架 import java.util.Scanner;public class Main {public static class ...

  2. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  3. C语言单链表实现栈(stack)数据结构

    栈 1.栈是限定仅在表尾进行插入和删除操作的线性表.把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 2.栈是先进后出(LIFO)结构. 3.栈的插入叫进栈/压栈Push,删 ...

  4. STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

    Stack是一种先进后出的数据结构,他只有一个出口 stack允许 新增元素.移除元素.取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为 Stack定义的完整列表 (双端 ...

  5. Java实现单链表、栈、队列三种数据结构

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:远航 cnblogs.com/yang-guang- ...

  6. C++用数组和链表分别实现Stack

    C++用数组和链表分别实现Stack C++学习有段时间了,感觉还是有很多不足啊,今天自己用数组和链表分别实现Stack,当然STL中的Stack肯定不是这么简单,你不妨看一下,说不定有收获呢,若发现 ...

  7. 在java的实现栈的插入数据_Java实现数据结构栈stack和队列Queue

    回顾JDK提供的集合类 容器(集合)框架如下: 集合类存放于java.util包中.集合类存放的都是对象的引用,而非对象本身. 集合类型主要有3种:set(集).list(列表)和map(映射). C ...

  8. java中队列链表栈的作用_Java用链表实现栈和队列

    1.用链表实现栈 package stack; /** * * @author denghb * */ class Link { public long dData; public Link next ...

  9. (数据结构与算法)数组和单链表实现栈的基本操作

    数组实现栈 栈接口 public interface Stack<E> {int getSize();boolean isEmpty();void push(E e);E pop();E ...

  10. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...

    本文实例讲述了java数据结构之链表.栈.队列.树的实现方法.分享给大家供大家参考,具体如下: 最近无意中翻到一本书,闲来无事写几行代码,实现几种常用的数据结构,以备后查. 一.线性表(链表) 1.节 ...

最新文章

  1. 一文总结词向量的计算、评估与优化
  2. ubuntu g++编译32位应用
  3. LoRaWAN与LoRa的区别!
  4. 王道操作系统考研笔记——1.1.1 操作系统的概念、功能和目标
  5. html:(39):块级元素和内联块级元素
  6. Quick BI产品核心功能大图(六)开放集成
  7. PL-VIO论文阅读
  8. C/C++ 安全编码 —— 不安全的函数
  9. Android 安装腾讯X5内核
  10. 操作系统-3.假设某多道程序设计系统中有供用户使用的内存100KB,打印机1台。系统采用可变分区方式管理内存:对打印机采用静态分配,并假设输入输出操作的时间忽略不计;采用最短剩余时间优先的进程调度算法
  11. 微信html5视频播放器,解决微信h5页面视频播放问题实例
  12. 腾讯云云服务器部署Davinci可视化
  13. 想去游戏公司做游戏,最重要的是什么素养?
  14. IHS Markit:苹果16英寸MacBook Pro将采用英特尔第9代处理器
  15. Windows10 电源选项中没有 唤醒时需要密码
  16. 什么软件可以测试sd卡,如何做SD卡测试和SD卡测试工具
  17. EF实体类种的Virtual关键字作用
  18. 2015浙江理工校赛A 孙壕请一盘青岛大虾呗(简单搜索)
  19. 【震惊】超市不能说的N个秘密:你已在不知不觉中上当
  20. 深兰科技的征途,AI的赛场与战场

热门文章

  1. B7 HTML5期末大作业:海贼王影视网站设计——仿京东-海贼王(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 wweb前端期末大作业 网页设计实例 企业网站制作
  2. java调用手机截屏_android实现手机截屏并保存截图功能
  3. 春天里,程序猿宅男的“桃花”怎么开
  4. 按键精灵通过抓抓工具来获取坐标位置
  5. Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource
  6. 利用leaflet做一个飞机航线 可根据方向动态掉头
  7. 字节跳动否认完成支付牌照收购,但金融野心一直有...
  8. 数据库系统原理与应用教程(042)—— MySQL 查询(四):使用通配符构造查询条件
  9. alpha在matlab中啥意思,alpha是什么
  10. 摄像头参数详细介绍[转]