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日

相关文章

  • java实现文件上传下载和图片压缩代码示例

    Java实现文件上传 1. 准备工作 在进行文件上传前,需要在服务器上建立一个存储上传文件的目录,并且需要在前端用HTML5的file标签来设置文件选择框。 2. 前端代码 前端代码使用HTML5的form表单和一个file选择框,具体如下: <!DOCTYPE html> <html lang="en"> &lt…

    Java 2023年5月20日
    00
  • win10启动docker报错,错误码 0xffffffff

      一、注册表修复(如果有就不用管) 在\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\添加了一个项392EB46D(不重复即可) 名称 类型 值 进制 AppFullPath 字符串值 C:\Windows\System32\ws…

    Java 2023年4月18日
    00
  • 全面解析java final关键字

    全面解析java final关键字 1. 什么是final关键字 final是Java语言中的一个关键字,它可以用来修饰变量、方法和类,表示该变量、方法或类只能被赋值一次或者在声明时被初始化一次,并不能再被修改或继承。final关键字有时被称为“不可变量”、“常量”、“最终变量”等。 2. final变量 final变量表示的是一旦被初始化,就不能再修改该变…

    Java 2023年5月26日
    00
  • Java 内存溢出的原因和解决方法

    Java 内存溢出的原因和解决方法 Java 内存溢出是 Java 开发中常见的问题之一,当程序运行需要的内存超过了 JVM 分配给程序的内存时,就会发生内存溢出的问题。本文将详细介绍 Java 内存溢出的原因和解决方法,以及两个示例说明。 常见内存溢出的原因 1. 对象无法被合理的回收 在 Java 中,内存的回收是通过垃圾回收机制(GC)实现的。当对象引…

    Java 2023年5月26日
    00
  • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    我们来讲解一下“SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2”的完整攻略。 简介 SSH框架是指Struts2、Hibernate、Spring这三个开源框架的组合,是经典的Java Web框架。整合这三个框架可以让项目的开发更高效、更具可维护性。 本文将讲解如何将这三个框架整合在网上商城项目中。 整合步骤 …

    Java 2023年5月19日
    00
  • Spring五大类注解读取存储Bean对象的方法

    下面是详细的讲解“Spring五大类注解读取存储Bean对象的方法”的完整攻略。 一、概述 Spring 是一种非常受欢迎的 Java 开发框架,它提供了一套非常完整的依赖注入机制,使得开发者可以轻松地使用 Spring 来管理 Bean 对象。而 Spring 的 Bean 对象的创建方式就有五大类注解方式,它们分别是:@Component、@Reposi…

    Java 2023年5月26日
    00
  • Java基础知识之StringWriter流的使用

    下面是“Java基础知识之StringWriter流的使用”的完整攻略。 1. StringWriter流简介 在Java中,StringWriter流是一个带有自动缓冲区的字符流。通过使用StringWriter流,我们可以在内存中实现写字符串操作。StringWriter流无需指定目标文件或控制台输出等设备,可以将数据流写入到内存中的缓冲区,直到输出完毕…

    Java 2023年5月26日
    00
  • 详解Java在redis中进行对象的缓存

    下面请看“详解Java在redis中进行对象的缓存”的完整攻略: 1. 前置知识 Java操作Redis缓存需要用到Jedis,因此需要先引入相关的依赖包,如下: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifa…

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