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

yizhihongxing

实现下压栈的操作是实现栈数据结构的一种方式,下面是如何用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日

相关文章

  • java中int初始化可以为0,但不能为NULL问题

    在Java中,int类型的变量可以被初始化为0,但不能被初始化为NULL。这是因为在Java中,int是原始数据类型,而NULL是引用数据类型的特殊值,不适用于原始数据类型的变量。 如果我们试图初始化一个int变量为NULL,将会得到一个编译时错误: int a = NULL; // 编译报错 相反,我们可以将int变量初始化为0: int a = 0; 在…

    Java 2023年5月19日
    00
  • 详解利用Spring的AbstractRoutingDataSource解决多数据源的问题

    利用Spring的AbstractRoutingDataSource可以方便地解决多数据源的问题,它可以根据配置文件中的路由信息自动地选择正确的数据源进行访问。接下来,我将通过以下步骤详细讲解如何使用AbstractRoutingDataSource解决多数据源的问题: 1. 配置DataSource 在Spring配置文件中定义多个DataSource,并…

    Java 2023年5月20日
    00
  • 基于SpringBoot实现代码在线运行工具

    基于 Spring Boot 实现代码在线运行工具的完整攻略 在本文中,我们将详细讲解如何基于 Spring Boot 实现代码在线运行工具的完整攻略。我们将使用 Spring Boot、Thymeleaf 和 JavaCompiler API 来实现这个工具。 步骤一:创建 Spring Boot 项目 首先,我们需要创建一个 Spring Boot 项目…

    Java 2023年5月15日
    00
  • Java 创建cookie和删除cookie

    当用户访问一个网站时,该网站可能会使用cookie来跟踪用户会话或记录用户活动。Java提供了创建和删除cookie的API,这些API可以通过相关的HTTP请求来使用。 创建Cookie 创建Cookie需要使用javax.servlet.http.Cookie类。该类提供了以下构造函数: public Cookie(String name, String…

    Java 2023年6月16日
    00
  • java 字符串分割的三种方法(总结)

    Java 字符串分割是一种将字符串拆分为多个子字符串的技术。它是一个常见的字符串操作,用于从文本数据中提取所需的信息。 下面是java字符串分割的三种方法及其详细讲解: 方法一:使用split()方法进行分割 Java中String类有一个split()方法,可以根据指定的分隔符将字符串拆分为多个子字符串,并将结果存储在一个数组中。 String str =…

    Java 2023年5月26日
    00
  • Spring Boot maven框架搭建教程图解

    欢迎来到本站!下面我将为您详细讲解如何使用Maven来创建一个基于Spring Boot的web应用程序。 简介 Spring Boot是一个基于Spring框架的快速开发Web应用程序的工具,它可以帮助开发人员快速构建Web应用程序,同时也提供了各种常用的开发工具和依赖项。 Maven是一款Java构建工具,它可以帮助开发人员管理和构建Java项目中的依赖…

    Java 2023年5月19日
    00
  • Java如何实现登录token令牌

    Java实现登录token令牌的方法有多种,一种较为常见的方式是利用JSON Web Token(JWT)。 什么是JWT? JWT是一种开放标准(RFC 7519),可以在不同应用程序之间安全地传递信息,该信息可以进行身份验证和授权。JWT包含三部分:头部,载荷(也称为声明)和签名。头部通常包含使用的签名算法,载荷包含请求的用户数据和其他元数据,签名用于验…

    Java 2023年5月26日
    00
  • spring boot入门开始你的第一个应用

    下面我将详细讲解“SpringBoot入门:开始你的第一个应用”的完整攻略。 1. 环境搭建 在开始之前,我们需要安装Java和IDE,推荐使用IntelliJ IDEA进行开发。然后,我们还需要安装SpringBoot。 2. 新建项目 我们可以选择创建一个Maven项目或者Gradle项目,这里我选择创建Maven项目。使用IDEA创建Maven项目需要…

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