如何从使用数组构建的堆栈中删除元素?

时间:2014-10-09 18:42:54

标签: java arrays nullpointerexception stack

我正在学习筹码。当我遇到Java不允许“从null转换为int”时,我试图为pop()编写代码...

如何从数组中删除元素?即使我将null类型化为整数,它也会抛出空指针异常。

我在网上看过的大多数其他教程只是改变了堆栈的顶部而对索引的值没有任何作用。

检查下面的int pop()功能

static class Stack{

        int[] holder;
        int capacity;
        int top;

        //Constructor
        Stack(int a){
            holder = new int[a];
            capacity = a-1;
            top = -1;
        }

        //Method to Print Stack
        void PrintStack(){
            System.out.println(Arrays.toString(this.holder));
        }

        //Method to PUSH
        void push(int a){
            //Check for StackOverflow
            if(top == capacity){
                System.out.println("Stack Overflow!!!");
                }
            else{
                top++;
                this.holder[top] = a;
            }
        }

        //Method to POP
        int pop(){
            //Check for StackUnderflow
            if(top == -1){
                System.out.println("Stack Underflow");
            }
            else{
                return this.holder[top];
                this.holder[top] = null;
                top--;
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

如果要在整数数组中表示null,请使用java Integer类型,而不是本机int类型。

将旧值留在堆栈中未使用的位置并不可怕。过去,数字零和空值之间没有区别,因此修改未使用的插槽中的值没有任何好处。

答案 1 :(得分:1)

我认为以下内容可能更能准确地表达您尝试完成的工作。将int转换为Integer并返回null,这是现在允许的,因为它是一个Integer类型。

public class Stack{

        Integer[] holder;
        int capacity;
        int top;

        //Constructor
        Stack(int a){
            holder = new Integer[a];
            capacity = a-1;
            top = -1;
        }

        //Method to Print Stack
        void PrintStack(){
            System.out.println(Arrays.toString(this.holder));
        }

        //Method to PUSH
        void push(int a){
            //Check for StackOverflow
            if(top == capacity){
                System.out.println("Stack Overflow!!!");
                }
            else{
                top++;
                this.holder[top] = a;
            }
        }

        //Method to POP
        Integer pop(){
            //Check for StackUnderflow
            if(top == -1){
                return null;
            }
            else{
                return this.holder[top--];
            }
        }
    }

答案 2 :(得分:1)

由于这是(基本)整数数组,因此无法将null指定给其中的元素。实际上,当创建数组时,它的元素不是null,它们被设置为零,这是整数的默认初始值。

如果数组是一个对象数组,那么用pop替换弹出元素是很重要的,否则这些对象不会被垃圾收集。当数组是基本类型时,该问题不存在,因此您可以保持原样。

但是,我建议你改变你的数组打印方法,因为不管目前的堆栈大小,它总是打印整个数组。那会令人困惑。您应该只将数组打印到" top"元件。