返回顶部
首页 > 资讯 > 精选 >Java中的栈实现方法
  • 172
分享到

Java中的栈实现方法

2023-06-17 10:06:31 172人浏览 独家记忆
摘要

本篇内容主要讲解“Java中的栈实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的栈实现方法”吧!栈的实现栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口:public&

本篇内容主要讲解“Java中的栈实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的栈实现方法”吧!

栈的实现

栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口:

public interface MyStack<T> {           boolean isEmpty();           void clear();           int length();           boolean push(T data);           T pop();  }

栈的数组实现,底层使用数组:

public class MyArrayStack<T> implements MyStack<T> {      private Object[] objs = new Object[16];      private int size = 0;       @Override     public boolean isEmpty() {          return size == 0;      }       @Override     public void clear() {          // 将数组中的数据置为null, 方便GC进行回收          for (int i = 0; i < size; i++) {              objs[size] = null;          }          size = 0;      }       @Override     public int length() {          return size;      }       @Override     public boolean push(T data) {          // 判断是否需要进行数组扩容          if (size >= objs.length) {              resize();          }          objs[size++] = data;          return true;      }            private void resize() {          Object[] temp = new Object[objs.length * 3 / 2 + 1];          for (int i = 0; i < size; i++) {              temp[i] = objs[i];              objs[i] = null;          }          objs = temp;      }       @SuppressWarnings("unchecked")      @Override     public T pop() {          if (size == 0) {              return null;          }          return (T) objs[--size];      }       @Override     public String toString() {          StringBuilder sb = new StringBuilder();          sb.append("MyArrayStack: [");          for (int i = 0; i < size; i++) {              sb.append(objs[i].toString());              if (i != size - 1) {                  sb.append(", ");              }          }          sb.append("]");          return sb.toString();      }  }&nbsp;&nbsp;

栈的链表实现,底层使用链表:

public class MyLinkedStack<T> implements MyStack<T> {           private node top;           private int size;            public MyLinkedStack() {          top = null;          size = 0;      }            @Override     public boolean isEmpty() {          return size == 0;      }            @Override     public void clear() {          top = null;          size = 0;      }            @Override     public int length() {          return size;      }            @Override     public boolean push(T data) {          Node node = new Node();          node.data = data;          node.pre = top;          // 改变栈顶指针          top = node;          size++;          return true;      }            @Override     public T pop() {          if (top != null) {              Node node = top;              // 改变栈顶指针              top = top.pre;              size--;              return node.data;          }          return null;      }                 private final class Node {          private Node pre;          private T data;      }  }

两种实现的比较,主要比较数据入栈和出栈的速度:

@Test public void testSpeed() {      MyStack<Person> stack = new MyArrayStack<Person>();      int num = 10000000;      long start = System.currentTimeMillis();      for (int i = 0; i < num; i++) {          stack.push(new Person("xing", 25));      }      long temp = System.currentTimeMillis();      System.out.println("push time: " + (temp - start));      while (stack.pop() != null)          ;      System.out.println("pop time: " + (System.currentTimeMillis() - temp));  }

MyArrayStack中入栈和出栈10,000,000条数据的时间:

push time:936

pop time:47

将MyArrayStack改为MyLinkedStack后入栈和出栈的时间:

push time:936

pop time:126

可见两者的入栈速度差不多,出栈速度MyArrayStack则有明显的优势。

为什么测试结果是这样的?可能有些朋友的想法是数组实现的栈应该具有更快的遍历速度,但增删速度应该比不上链表实现的栈才对。但是栈中数据的增删具有特殊性:只在栈顶入栈和出栈。也就是说数组实现的栈在增加和删除元素时并不需要移动大量的元素,只是在数组扩容时需要进行复制。而链表实现的栈入栈和出栈时都需要将数据包装成Node或者从Node中取出数据,还需要维护栈顶指针和前驱指针。

栈的应用举例

将10进制正整数num转换为n进制

private String conversion(int num, int n) {      MyStack<Integer> myStack = new MyArrayStack<Integer>();      Integer result = num;      while (true) {          // 将余数入栈          myStack.push(result % n);          result = result / n;          if (result == 0) {              break;          }      }      StringBuilder sb = new StringBuilder();      // 按出栈的顺序倒序排列即可      while ((result = myStack.pop()) != null) {          sb.append(result);      }      return sb.toString();  }

检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的。

遍历字符串的每一个char, 将char与栈顶元素比较. 如果char和栈顶元素配对, 则char不入栈, 否则将char入栈. 当遍历完成时栈为空说明字符串是合法的。

public boolean isMatch(String str) {      MyStack<Character> myStack = new MyArrayStack<Character>();      char[] arr = str.toCharArray();      for (char c : arr) {          Character temp = myStack.pop();          // 栈为空时只将c入栈          if (temp == null) {              myStack.push(c);          }          // 配对时c不入栈          else if (temp == '[' && c == ']') {          }           // 配对时c不入栈          else if (temp == '(' && c == ')') {          }           // 不配对时c入栈          else {              myStack.push(temp);              myStack.push(c);          }      }      return myStack.isEmpty();  }

行编辑: 输入行中字符'#'表示退格, '@'表示之前的输入全都无效。

使用栈保存输入的字符, 如果遇到'#'就将栈顶出栈, 如果遇到@就清空栈. 输入完成时将栈中所有字符出栈后反转就是输入的结果:

private String lineEdit(String input) {      MyStack<Character> myStack = new MyArrayStack<Character>();      char[] arr = input.toCharArray();      for (char c : arr) {          if (c == '#') {              myStack.pop();          } else if (c == '@') {              myStack.clear();          } else {              myStack.push(c);          }      }            StringBuilder sb = new StringBuilder();      Character temp = null;      while ((temp = myStack.pop()) != null) {          sb.append(temp);      }      // 反转字符串      sb.reverse();      return sb.toString();  }

到此,相信大家对“Java中的栈实现方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java中的栈实现方法

本文链接: https://lsjlt.com/news/288423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中的栈实现方法
    本篇内容主要讲解“Java中的栈实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的栈实现方法”吧!栈的实现栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口:public&...
    99+
    2023-06-17
  • C语言中栈的两种实现方法
    栈的两种实现方式 通常情况下,栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组。但是在调用程序时,我们没有必要知道具体使用了哪种方法。 一、顺序栈 #inclu...
    99+
    2024-04-02
  • java中栈的数组和链表实现
    栈的介绍栈,是一种先进后出(FILO)的线性数据结构,主要操作为入栈和出栈。栈底:最早进入的元素存放的位置。栈顶:最后进入元素存放的位置(有些栈中将栈顶表示为栈顶元素的下一位置)。免费在线学习视频推荐:java视频栈的数组的实现示例如下:p...
    99+
    2014-09-11
    java教程 java 数组 链表 实现
  • Java栈如何实现
    本篇内容介绍了“Java栈如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!栈栈 (Stack) 是一种运算受限的线性表, 遵循先进后出...
    99+
    2023-06-29
  • C语言中栈的两种实现方法详解
    目录一、顺序栈二、链式栈总结一、顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 ...
    99+
    2024-04-02
  • 队列实现栈的方法有哪些
    本篇内容介绍了“队列实现栈的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先来回顾一下栈(Sta...
    99+
    2024-04-02
  • Java中怎么实现栈和队列
    这期内容当中小编将会给大家带来有关Java中怎么实现栈和队列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。栈的创建:我们接下来通过链表的形式来创建栈,方便扩充。代码实现:public class Stac...
    99+
    2023-06-17
  • Java栈之链式栈存储结构的实现代码
    Java栈之链式栈存储结构实现一、链栈采用单链表来保存栈中所有元素,这种链式结构的栈称为链栈。二、栈的链式存储结构实现package com.ietree.basic.datastructure.stack;public class Lin...
    99+
    2023-05-31
    java 存储
  • 【数据结构】Java实现栈
    目录 1. 概念 2. 栈的使用  3. 自己动手实现栈(使用动态数组实现栈)  1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整...
    99+
    2023-10-27
    数据结构 jvm java
  • Java数据结构之栈的基本定义与实现方法示例
    本文实例讲述了Java数据结构之栈的基本定义与实现方法。分享给大家供大家参考,具体如下:一、概述:1、基本概念:栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,...
    99+
    2023-05-30
    java 数据结构
  • java中的OPT算法实现方式
    目录java实现OPT算法FIFO LRU OPT 算法java实现java实现OPT算法 1966年,Belady提出最佳页面替换算法(OPTimal replacement,OP...
    99+
    2024-04-02
  • java栈与队列如何实现
    这篇文章主要介绍了java栈与队列如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java栈与队列如何实现文章都会有所收获,下面我们一起来看看吧。栈与队列栈 (Stack)是一种后进先出(last in ...
    99+
    2023-06-19
  • Java栈与队列怎么实现
    本篇内容主要讲解“Java栈与队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java栈与队列怎么实现”吧!1、实现循环队列【OJ链接】循环队列一般通过数组实现。我们需要解决几个问题。...
    99+
    2023-06-29
  • Java实现LeetCode的方法
    小编给大家分享一下Java实现LeetCode的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可...
    99+
    2023-06-20
  • 详解Java 打印堆栈的几种方法
    java 中可以通过 eclipse 等工具直接打印堆栈,但是对于某些环境中无法使用 eclipse 工具时,需要知道堆栈,如何处理呢?介绍3种方法供选择:方法一:package name.xu;public class CallStack...
    99+
    2023-05-31
    java 打印 堆栈
  • JavaScript中如何实现栈
    这篇文章将为大家详细讲解有关JavaScript中如何实现栈,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript 栈栈是一种遵从先进后出(LIFO)原则的有...
    99+
    2024-04-02
  • LyScript实现对内存堆栈扫描的方法详解
    LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处...
    99+
    2024-04-02
  • java中Enum类的常用方法实现
    枚举类型预定义的方法:public static enumtype[] values() //枚举类型的数组,该数组包含枚举的所有枚举成员,并按他们的生命顺序存储 public static enumtype valueOf(...
    99+
    2017-07-03
    java入门 java Enum
  • java中懒惰评估的实现方法
    小编给大家分享一下java中懒惰评估的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明惰性评估是将表达式的评估延迟到需要时才进行的过程。Java是严...
    99+
    2023-06-15
  • Java栈和基础队列的实现详解
    目录栈(stack)栈支持的三个核心操作:栈的常见实际应用:栈的实现队列无论是哪种队列,都必须支持三个核心操作:基础队列的实现 栈和队列:都是线性表,都是基于List基础上...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作