当前位置: 首页 > 知识库问答 >
问题:

Java堆栈-如何从堆栈中弹出()和推送()多个元素?

严成礼
2023-03-14

我已经有一个stack类在工作,但是现在我每次只能弹出一个元素,我希望能够同时弹出多个元素。无需多次使用推送和弹出。我试图创建两个函数来实现这一点。函数pushAll和popN。比如:

public void pushAll (Object all[]) throws StackFullException {...}
public Object [] popN (int n) throws StackEmptyException {...}

备注:输入参数all是一个数组,包含所有必须输入的元素。向量的最后一个元素必须在叠加后位于顶部。如果没有空间插入所有元素,则必须不插入任何元素,并且必须引发StackFullException异常。popN方法弹出由n参数指定的元素数,并将它们存储到一个数组中以返回。如果堆栈没有请求的元素数,则没有元素被解除堆栈,并引发StackEmptyException异常。我花了好几个小时来研究我的逻辑,但没有成功。以下是我目前为止的Stack课程:

public class Stack extends RuntimeException {
    public static final int CAPACITY = 1000;
    private int capacity;
    private Object elements[];
    private int top = -1;

    public Stack(int capacity){
        if (capacity>0){
            this.capacity=capacity;
            elements=new Object[capacity];
        } else {
            this.capacity = CAPACITY;
            elements = new Object[CAPACITY];
        }
    }  
    public Stack(){
        this(CAPACITY);
    }
    
    public boolean isEmpty(){
        return (top < 0);
    }
    
    public boolean isFull(){
        return (top == capacity - 1);      
    }
    
    public void push(Object o) throws StackFullException {
        if (isFull()){
            throw new StackFullException("Stack Overflow!");
        }
        else {
            top++;
            elements[top] = o;
        }
    }
    
    public Object pop() throws StackEmptyException {
        Object elem;
        if (isEmpty()){
            throw new StackEmptyException("Stack Underflow!");
        }
        else {
            elem = elements[top];
            elements[top] = null;
            top--;
            return (elem);
        }
    }
    
    public Object top() throws StackEmptyException {
        if (isEmpty()){
            throw new StackEmptyException("Stack Underflow!");
        }
        else {
            return (elements[top]);
        }
    }
    
    public int size(){
        return (top + 1);
    };

    public Object[] getElements() {
        return elements;
    }
    
    @Override
    public String toString(){
        String string = "[";
        for (int i = 0; i < this.capacity; i++){
            Object element = this.elements[i];
            
            if(element != null){
                string += element + ",";
            }
        }
        string =  string.substring(0, string.length() - 1);
        string += "]";
        return string;
    }
    
    
    public void pushAll (Object all[]) throws StackFullException {
    
    }
    public Object [] popN (int n) throws StackEmptyException {
        
    }
}

能帮我建立pushAll和popN功能吗?

共有1个答案

农鸿达
2023-03-14

没有这样的方式,你可以一次只推送和弹出一个元素,你能做的就是做一个方法,把你要弹出或推送的元素的堆栈和数量传下来,使用循环来实现。

 类似资料:
  • 问题内容: 嗨,我正在尝试使用另一个空堆栈反转堆栈(我自己编写了一个堆栈)。由于某种原因,它无法正常工作。谁能帮我这个 ? 问题答案: while(!stack1.isEmpty()){ Integer value = (Integer)stack1.pop(); System.out.println(value); reverse.push(value); }

  • 问题内容: 我正在运行一个用Java在Eclipse中编写的程序。对于很大的输入,该程序具有很深的递归级别。对于较小的输入,程序运行正常,但是在给出较大的输入时,出现以下错误: 可以通过增加Java堆栈大小来解决此问题,如果可以,那么如何在Eclipse中做到这一点? 更新: @乔恩·斯基特 该代码递归地遍历解析树以建立数据结构。因此,例如,代码将使用解析树中的一个节点来做一些工作,并在该节点的两

  • 作为一个系统语言,Rust 在底层运作。如果你有一个高级语言的背景,这可能有一些你不太熟悉的系统编程方面的内容。最重要的一个是内存如何工作,通过栈和堆。如果你熟悉类 C 语言是如何使用栈分配的,这个章节将是一个复习。如果你不太了解,你将会学到这个更通用的概念,不过是专注于 Rust 的。 对于大部分内容,当学习他们的时候,我们会使用一个简化的模型来开始。这使得你可以掌握基础,而不会现在就因为不相关

  • 问题内容: 在Java中,是否有任何方法可以查看完整的,未截断的堆栈跟踪(例如,通过增加记录的帧数),或者以其他方式查看堆栈跟踪的 底部 ?通常,堆栈跟踪会从顶部截断为1024帧,但是对于堆栈溢出问题,这是毫无价值的,因为您确实需要查看是谁触发了触发递归的调用,位于底部附近。在堆栈 中间 截断会更好,但是显然Sun的JVM不够聪明。 也许甚至一些特定于Sun的特殊标志?我尝试将堆栈大小减小到最小允

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(