java 实现下压栈的操作(能动态调整数组大小)

实现下压栈的操作是实现栈数据结构的一种方式,下面是如何用Java实现这种操作,同时可以动态调整数组大小。

实现步骤

  1. 定义一个类来存储栈的操作。
  2. 在该类中创建一个数组来存储栈的元素。
  3. 创建一个变量来存储栈中元素的数量。
  4. 实现一个方法push(),将元素压入栈中。如果数组已满,则将数组的大小扩大一倍。将新元素添加到数组的结尾。
  5. 实现一个方法pop(),将栈顶元素弹出并返回。如果数组数目小于数组大小的四分之一,则将数组大小缩小一半。
  6. 实现一个方法isEmpty(),检查栈是否为空。
  7. 实现一个方法size(),返回栈中元素的数量。

下面是示例代码:

public class Stack<Item>{
    private Item[] items;
    private int size;
    private int capacity;

    public Stack(int capacity){
        items = (Item[]) new Object[capacity];
        this.capacity = capacity;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    public int size(){
        return size;
    }

    private void resize(int capacity){
        Item[] temp = (Item[]) new Object[capacity];
        for (int i = 0; i < size; i++){
            temp[i] = items[i];
        }
        items = temp;
        this.capacity = capacity;
    }

    public void push(Item item){
        if (size == capacity){
            resize(capacity * 2);
        }
        items[size++] = item;
    }

    public Item pop(){
        Item item = items[--size];
        items[size] = null;
        if (size > 0 && size == capacity / 4){
            resize(capacity / 2);
        }
        return item;
    }
}

这里我们定义了一个Stack类。其泛型类型为Item。它包含了一个数组itemssize变量来表示栈中元素的数量。另外还有一个capacity变量表示数组的大小。

接着实现了isEmpty()和size()两个方法。

resize()方法用于重新分配数组大小。新建一个新的数组temp,将目前数组中的所有元素复制到新数组中。

push()方法将元素压入栈中。如果数组已满,将调用resize()方法将数组大小扩大一倍。将新元素添加到数组的末尾。

pop()方法从栈顶弹出元素并返回其值。如果数组中的元素数量小于数组大小的四分之一,则将数组大小缩小一半。

接下来,我们用实例来说明一下该类的使用方法。

示例1:使用Stack类实现栈的基本操作

Stack<String> stack = new Stack<String>(10);
stack.push("Hello");
stack.push("World!");
stack.push("How");
stack.push("are");
stack.push("you?");
while (!stack.isEmpty()){
    System.out.print(stack.pop() + " ");
}

输出结果:

you? are How World! Hello 

示例2:使用Stack类实现对表达式的求值

Stack<Double> vals = new Stack<Double>(10);
Stack<String> ops = new Stack<String>(10);

while (!StdIn.isEmpty()) {
    String s = StdIn.readString();
    if (s.equals("(")) ;
    else if (s.equals("+")) ops.push(s);
    else if (s.equals("-")) ops.push(s);
    else if (s.equals("*")) ops.push(s);
    else if (s.equals("/")) ops.push(s);
    else if (s.equals("sqrt")) ops.push(s);
    else if (s.equals(")")) {
        String op = ops.pop();
        double v = vals.pop();
        if (op.equals("+")) v = vals.pop() + v;
        else if (op.equals("-")) v = vals.pop() - v;
        else if (op.equals("*")) v = vals.pop() * v;
        else if (op.equals("/")) v = vals.pop() / v;
        else if (op.equals("sqrt")) v = Math.sqrt(v);
        vals.push(v);
    }
    else vals.push(Double.parseDouble(s));
}

System.out.println(vals.pop());

输入表达式:

( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )

输出结果:

101.0

以上就是实现下压栈操作并动态调整数组大小的步骤和示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 实现下压栈的操作(能动态调整数组大小) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php与js的区别是什么

    PHP和JavaScript(JS)是两种不同的编程语言,尽管这两种语言都经常用于Web开发,但它们在很多方面存在明显的差异。以下是PHP和JavaScript的一些显著区别: 1. 服务器端与客户端 PHP通常在服务器端运行,它的主要任务是与数据库相互作用,并生成Web页面的HTML代码,然后将这些代码发送到用户终端浏览器进行呈现。 而JavaScript…

    Java 2023年6月15日
    00
  • java中的取整与四舍五入方法实例

    Java中的取整与四舍五入方法实例 在Java中,常用的取整和四舍五入方法是Math.floor、Math.ceil、Math.round,本文将详细介绍这三个方法的用法和示例说明。 Math.floor Math.floor是向下取整,表示得到的最大整数。它的用法为:Math.floor(x),其中x为一个double类型的数。具体实现为删去小数部分,只保…

    Java 2023年5月26日
    00
  • 一个开发人员眼中的JSP技术(下)

    下面是详细讲解“一个开发人员眼中的JSP技术(下)”的完整攻略: JSP是什么? JSP(JavaServer Pages)是一种动态网页开发技术,它使用Java语言和HTML标签来创建动态网页。JSP页面被Web容器处理并动态生成网页,多用于开发大型Web应用程序。下面是一个简单的JSP示例: <%@ page language="java…

    Java 2023年6月15日
    00
  • Springboot实现根据用户ID切换动态数据源

    下面详细讲解一下Spring Boot实现根据用户ID切换动态数据源的完整攻略。 1. 背景介绍 在一些需要多数据源分库分表的项目中,我们需要根据用户ID来动态切换数据源。比如将同一张表中不同用户的数据划分到不同的数据库中进行存储,这样可以有效地降低数据库的负载,提高系统的性能。 2. 实现步骤 2.1 引入相关依赖 我们可以通过引入Spring Boot的…

    Java 2023年6月3日
    00
  • jackson 实体转json 为NULL或者为空不参加序列化(实例讲解)

    Jackson 实体转 JSON 为 NULL 或者为空不参加序列化 为什么要从 JSON 反序列化成实体对象? 在进行 web 开发过程中,前后端数据传输离不开 JSON 字符串。服务器需要将实体对象转成 JSON 字符串返回给前端,而前端也需要将 JSON 字符串转成实体对象进行传入后端。Jackson 可以方便的实现该过程。 实现实体转 JSON 基础…

    Java 2023年5月26日
    00
  • 深入浅析 Spring Security 缓存请求问题

    深入浅析 Spring Security 缓存请求问题 问题概述 在使用 Spring Security 进行权限管理时,我们通常会遇到「页面缓存」或「接口缓存」的问题。这里的缓存指的是浏览器或客户端针对请求结果的缓存。 通常情况下,为了确保系统的安全性,我们不希望缓存敏感数据,例如用户信息、权限信息等。但是,当我们进行权限验证时,如果对同一个请求进行多次验…

    Java 2023年5月20日
    00
  • 浅谈FileItem类的常用方法

    下面开始介绍浅谈FileItem类的常用方法的攻略。 FileItem类简介 FileItem类是Apache Commons FileUpload库中的一个类,用于对上传的文件进行操作。该类可以获取上传文件的各种信息,包括文件名称、大小、MIME类型等等。下面我们将会介绍FileItem类的常用方法。 常用方法详解 1. getFieldName() 该方…

    Java 2023年5月19日
    00
  • Java 通过mave命令下载jar包的示例代码

    当需要使用 Maven 管理 Java 项目的依赖时,通常需要通过 Maven 命令下载 jar 包文件。下面是操作步骤: 安装 Maven 首先需要安装 Maven 工具。这里假设您已经安装了 Maven。 步骤一:创建项目 首先创建一个基于 Maven 的 Java 项目。可以使用 Eclipse 或 Intellij IDEA 等集成开发环境创建。 步…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部