栈是先进后出的一种数据结构,如图(来自百度):

好,概念不多说,下面我们来看栈基于链表的实现。
什么是链表?如下

public class Node {int val;Node next;Node(int x) {val = x;next = null;}
}

请自行脑补自行车链子,就是一种仅定义前后关系的数据结构,基于链表的这种特点,我们可以实现
出栈(删除栈顶)
入栈(添加栈顶)
判空(检查栈顶元素是否为空)
代码如下:

//通过链表实现
public class Stack {Node top;public Node peek() {//查看栈顶对象(不会删除)if (top != null) {return top;}return null;}public Node pop() {//出栈(会删除)if (top == null) {return null;} else {Node temp = new Node(top.val);top = top.next;return temp;}}public void push(Node n) {//入栈if (n != null) {n.next = top;top = n;}}public boolean isEmpty() {if (top == null) {return true;} else {return false;}}
}

基于数组:

//通过数组实现
public class stack {private int maxSize;// 栈的大小private int top;private char[] arr;public stack(int size) {maxSize = size;top = -1;arr = new char[maxSize];}public void push(char value) { // 压入数据arr[++top] = value;}public char pop() { // 弹出数据return arr[top--];}public char peek() { // 访问栈顶元素return arr[top];}public boolean isFull() { // 栈是否满了return maxSize - 1 == top;}public boolean isEmpty() { // 栈是否为空return top == -1;}}

可以看到基于数组和基于链表实现的栈,在某些方法上的异同,反映出了数组和链表的一些特性:

从逻辑结构角度来看a、 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。b、链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)从内存存储角度来看a、(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。b、 链表从堆中分配空间, 自由度大但申请管理比较麻烦.

效果图:

java中栈的两种实现相关推荐

  1. java声明异常必须抛出吗_简述java中抛出异常的两种方式

    java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看 ...

  2. (转载)java中super的两种用法

    (转载)http://www.cnblogs.com/rollenholt/articles/2033989.html 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说 ...

  3. java treeset比较,java中TreeSet的两种排序比较的方式

    第一种是使得元素具有比较性 第二种是让集合具有比较性 具体代码步骤如下: import java.util.*; /* * TreeSet:可以自动对对集合中的元素进行排序 * 第一种比较方式 * 步 ...

  4. java 中 return 的两种常见的用法

    一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...

  5. Java中return的两种用法

    一.return语句总是用在方法中,有两个作用. 一个是返回方法指定类型的值(这个值总是确定的). 一个是结束方法的执行(仅仅一个return语句). 一般的就百是用在有反回值的方法中,用来返回方度法 ...

  6. Java中foreach循环两种实现原理

    一.foreach循环Iterator模式 首先我们看一个foreach循环的main方法 import java.util.Collections; import java.util.List; i ...

  7. 大话数据结构(五)——栈的两种java实现方式

    在我们生活当中经常会看到这样一种操作,比如我们往一个空羽毛球盒子里面放羽毛球(个人比较喜欢羽毛球,嘿嘿),放完后再将羽毛球一个一个取出的时候会发现,最先放进去的羽毛球往往最后才取出来,相反,最后放入的 ...

  8. JAVA中的引用四种引用类型

    关于值类型和引用类型的话题,C++.JAVA.python.go.C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,在面试学习工作实践中都可以信手拈来(不要太纠集语言) ...

  9. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

最新文章

  1. provide和inject,Vue父组件直接给孙子组件传值
  2. 基于jquery多种切换效果的焦点图(兼容ie6)
  3. c语言读取exe的pe标记,PE文件信息读取程序(1.关键函数部分)
  4. ruby Rspec+jenkins+allure持续集成
  5. MySQL5.6解压版详细安装教程(附安装配置、MySQL数据库设置root管理员密码,MySQL字符集设置问题及解决办法)
  6. from _sqlite3 import ImportError DLL load failed 找不到指定的模块
  7. 在asp.net中如何自己编写highcharts图表导出到自己的服务器上来
  8. 【SpringBoot 2】(四)详析SpringBoot的常用注解
  9. 【工作总结】银行应用系统架构(二)
  10. Spring基础——AOP
  11. android 拨打电话 发送短信 权限,Android开发实现拨打电话与发送信息的方法分析...
  12. Windows 8 Directx开发学习笔记(一)应用基本框架
  13. 向着DJANGO奔跑!
  14. 创建对象时引用的关键字,assign,copy,retain
  15. ubuntu下切换到root用户
  16. Android3dtouch xposed,乐2 MIUI10 8.10.26增强版 主题和谐 黑域 3Dtouch 分屏 Gay设置-刷机之家...
  17. Mac上编译mingw
  18. c++ double 截取_C/C++ double取余函数
  19. bitblt和getpixel哪个更效率
  20. java linux解压_在LINUX下 用JAVA如何解压rar文件

热门文章

  1. 配置接口IP地址并通过静态路由、默认路由配置实现全网互通!
  2. python学习_循环语句
  3. 启用vsftpd日志及其解读
  4. 为什么要升级BIOS呢?(1)
  5. 【从饮水机到名人堂之c语言】操作符详解(1)
  6. redis命令,SpringBoot整合Redis6,主从复制,哨兵模式,集群,springCache初高级应用。
  7. 运放脉冲宽度放大_创鑫激光纳秒级脉冲激光器应用于精细焊接
  8. okhttp之自定义Interceptor:请求失败切换IP重试拦截器
  9. 5款支持Web端创作的脑图工具,学习一款就够了
  10. 只有一端开口的瓶子(C++)