我在研究堆栈。当我遇到Java不允许“从null转换为int”时,我正试图为pop()编写代码.
如何从数组中删除元素?即使我将null类型为integer,它也会引发空指针异常。
我在网上看到的大多数其他教程只是更改堆栈的顶部,对索引中的值不做任何处理。
检查下面的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--;
}
}
}发布于 2014-10-09 18:51:58
因为这是一个(原语)整数数组,所以不能将null分配给其中的一个元素。实际上,当创建数组时,它的元素不是null,它们被设置为零,这是整数的缺省初始值。
如果数组是一个对象数组,那么将弹出元素替换为null是很重要的,否则这些对象将不会被垃圾收集。当数组是原语类型时,这个问题就不存在了,所以您可以只保留原来的值。
但是,我建议您更改数组打印方法,因为无论堆栈的当前大小如何,它总是打印整个数组。那会让人困惑。您应该只打印到"top“元素的数组。
发布于 2014-10-09 18:44:49
如果要在整数数组中表示null,请使用java Integer类型,而不是本机int类型。
将旧值保留在堆栈中未使用的位置并不可怕。过去,数字0和空值之间没有区别,因此修改未使用时隙中的值没有好处。
发布于 2014-10-09 18:50:58
我认为以下可能是一种更准确的方式来表达你想要完成的事情。将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--];
}
}
}https://stackoverflow.com/questions/26285770
复制相似问题