一、栈的介绍

  • 栈的英文为(stack)
  • 栈是一个先入后出(FILO-First In Last Out)的有序列表。
  • 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
  • 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除

二、应用场景

  • 逆序输出
  • 数制转换

三、代码实现

  • 数组实现栈
public class ArrayStackDemo {public static void main(String[] args) {ArrayStack arrayStack = new ArrayStack(5);//显示栈内容arrayStack.show();//添加arrayStack.push(1);arrayStack.push(2);arrayStack.push(3);arrayStack.push(4);arrayStack.push(5);arrayStack.push(6);//显示栈内容System.out.println("添加值后的栈信息");arrayStack.show();//取出栈内容int stackPop = arrayStack.pop();System.out.println("取出的值为:"+stackPop);int stackPop2 = arrayStack.pop();System.out.println("取出的值为:"+stackPop2);//显示栈内容System.out.println("取出值后的栈信息");arrayStack.show();}}// 定义一个栈,用数组实现
class ArrayStack{//栈大小private int maxSize;//定义一个数组用于模拟栈private int[] stack;//定义栈顶为top,默认为-1private int top = -1;//创建栈需要定义栈大小public ArrayStack(int maxSize){this.maxSize = maxSize;this.stack = new int[this.maxSize];}// 判断栈空public boolean isEmpty(){return this.top == -1;}//判断栈满public boolean isFull(){return top == maxSize - 1;}//入栈public void push(int value){//判断是否栈满if(isFull()){System.out.println("栈已满!");return;}//将栈顶指针前进一位top++;//向栈中添加输入stack[top] = value;}//出栈public int pop(){//判断当前栈是否为空if(isEmpty()){System.out.println("当前栈空");throw new RuntimeException("当前栈无数据,不可出栈");}//将当前栈顶指向的数据存起来int value = stack[top];//栈顶后移一位top--;//将取得的数据返回return value;}//显示栈public void show(){//判断当前栈是否为空if(isEmpty()){System.out.println("当前栈空");return;}for (int i = top;i >= 0;i--){System.out.printf("stack[%d]=%d\n",i,stack[i]);}}
}
  • 链表实现栈 - 有头节点
public class LinkedListStackDemo {public static void main(String[] args) {LinkedListStack linkedListStack = new LinkedListStack(5);//显示栈内容linkedListStack.show();//添加linkedListStack.push(1);linkedListStack.push(2);linkedListStack.push(3);linkedListStack.push(4);linkedListStack.push(5);linkedListStack.push(6);//显示栈内容System.out.println("添加值后的栈信息");linkedListStack.show();//取出栈内容int stackPop = linkedListStack.pop();System.out.println("取出的值为:"+stackPop);int stackPop2 = linkedListStack.pop();System.out.println("取出的值为:"+stackPop2);//显示栈内容System.out.println("取出值后的栈信息");linkedListStack.show();}
}//用单向链表实现栈
class LinkedListStack {//栈大小private int maxSize;//定义一个节点用于当作头节点private Node first = new Node(-1);//定义栈顶为top,默认指向firstprivate Node top = first;//创建栈需要定义栈大小public LinkedListStack(int maxSize){this.maxSize = maxSize;}//判断当前栈中有效节点,从头节点的下一个开始到top栈顶为有效节点public int size(){//判断有没有有效节点if(first.next == null){return 0;}int size = 0;//创建临时指针用于计算节点数量Node temp = first.next;while (true){size++;//当前指针指向栈顶时退出if(temp == top){break;}temp = temp.next;}return size;}// 判断栈空public boolean isEmpty(){return size() == 0;}//判断栈满public boolean isFull(){return size() == maxSize;}//入栈public void push(int value){//判断是否栈满if(isFull()){System.out.println("栈已满!");return;}//创建对象Node node = new Node(value);//将新对象添加到栈中top.next = node;//将栈顶指针前进至新对象top = node;}//出栈public int pop(){//判断当前栈是否为空if(isEmpty()){System.out.println("当前栈空");throw new RuntimeException("当前栈无数据,不可出栈");}//将当前栈顶指向的数据存起来int value = top.number;//栈顶前移一位//创建临时指针Node temp = first;while (true){//找栈顶//temp.next指向top,说明temp是要出栈的前一个节点,将该节点当作栈顶if(temp.next == top){top = temp;break;}//后移指针temp = temp.next;}//将取得的数据返回return value;}//显示栈,从栈顶开始显示public void show(){//判断当前栈是否为空if(isEmpty()){System.out.println("当前栈空");return;}//创建临时指针Node temp;//循环栈当前实际大小次for (int i = size(); i >= 0; i--) {//每次临时指针都从头开始temp = first;//打印最后一个元素for (int j = 0; j < i; j++) {temp = temp.next;if(j == i-1){System.out.printf("stack[%d]=%d\n", j, temp.number);}}}}}class Node {int number;Node next;public Node(int number) {this.number = number;}@Overridepublic String toString() {return "Node{number=" + this.number + "}";}
}

手把手带你在Java中用【数组】和【链表】实现栈相关推荐

  1. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  2. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解

    一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...

  3. java的数组和链表从熟系到陌生

    数组和链表 java的数组是什么:数组是用来存放同一种数据类型的集合, 数组中每个元素都是相通的数据类型,数组就是在内存中划分一串连续的空间(数组作为对象允许使用new关键字进行内存分配),注意只能存 ...

  4. Java数据结构——数组、链表

    目录 数据的存储物理结构和逻辑结构 数组 数组的定义与初始化 特点 链表 链表相关代码技巧 数组与链表对比 数据的存储物理结构和逻辑结构 按物理结构: ①:连续的存储空间:数组 元素相邻,在内存中开辟 ...

  5. Java集合数组和链表

    先来介绍下最最简单的数据结构,数组和链表. 一.数组   数组是我们使用到的最简单的一个数据结构,数组的使用 // 动态初始化:初始化时由程序员只指定数组长度,由系统为数组元素分配初始值 char c ...

  6. 数据结构之数组、链表、栈和队列

    1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...

  7. 数据结构和算法详解(二)——线性表(数组、链表、栈、队列)

    一.数组 线性表:   线性表就是数据排成像一条线一样的结构.每个现行表上的数据最多只有前和后两个方向.常见的线性表结构:数组,链表.队列.栈等. 什么是数组: 数组(Array)是一种线性表数据结构 ...

  8. 算法章节 数组、链表、栈、队列

    数组 概念与特性 1,数组是线性表,用一组连续的内存空间存储⼀组具有相同类型的数据 2,最大的特性是⽀持按照下标O(1)时间复杂度内快速访问数组元素 3,⼀维数组寻址公式:a[i]_addr = ba ...

  9. 数据结构各结构特点(数组、链表、栈、队列、树)

    目录 一.数组 二.链表 三.栈 四.队列 五.树 1.二叉树 2.二叉查找树 3.平衡二叉树(AVL树) 4.红黑树 六.总结: 1.红黑树和平衡二叉树的区别: 2.为什么有了数组和链表还要引入二叉 ...

  10. 手把手带你入门Java中File类

    零基础学习Java之File类 概述 构造方法 基本介绍 代码示例 常用方法 获取文件和目录的基本信息 代码示例 判断功能 代码示例 创建和删除功能 代码示例 目录遍历功能 代码示例 概述 要学习Ja ...

最新文章

  1. VS2010旗舰版无法安装
  2. 【Nutch2.2.1基础教程之2.1】集成Nutch/Hbase/Solr构建搜索引擎之一:安装及运行【单机环境】...
  3. python ssh登录设备_用Python怎么SSH到网络设备
  4. 从傅里叶分析角度解读深度学习的泛化能力
  5. word流程图两条线的端点连接_GitMind免费的思维导图+流程图制作工具
  6. 拼接dem,山地出现平地
  7. 模板vs定制 门店小程序该如何选择?
  8. 01.神经网络和深度学习 W3.浅层神经网络
  9. label用js,jquery取值赋值,以及怎么在后台取值
  10. 自学python买什么教材-学习Python的正确姿势—基础教学,教科书该怎么买?
  11. docker php 一键部署,Docker Compose 一键部署LNMP
  12. 高德地图看各省分界线_请教 高德地图绘制行政区划边界
  13. 关于flash player的问题
  14. 淘宝店铺层级作用 店铺层级低有哪些影响
  15. 飞思卡尔智能车参赛感受,以及开源自己搜集的资料
  16. HDU - 6287 口算训练
  17. 使用JS判断用户操作系统是否安装某字体
  18. 哪一种Mac杀毒软件好用?这波安利绝对错不了
  19. 网上超市app开发现成源码对接
  20. Linux目录权限管理

热门文章

  1. Java 第 34 课 1365. 有多少小于当前数字的数字 1331. 数组序号转换
  2. WORD两个表格合并为一个表格(删除两个表格之间多余的空格)
  3. 北大邮箱收件服务器,邮箱手机客户端设置说明
  4. IDEA下载源码报错 Cannot reconnect.
  5. 基于EasyX图形库的天天爱消除
  6. 北京地铁,4号线换乘13号线,用时最短换乘线路
  7. u-boot编译构成之 MLO(1)
  8. HDU-1814 Peaceful Commission (2-SAT暴力模板 暴力染色+字典序最小)
  9. nas存储用网线直连服务器,NAS将存储设备通过标准的网络拓扑结构连接,无需服务器直接上网...
  10. PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)