[英]Generic stack implementation
我正在嘗試實現通用堆棧。
這是界面
package stack;
public interface Stack<T>{
void push(T number);
T pop();
T peek();
boolean isEmpty();
boolean isFull();
}
這是班級
package stack;
import java.lang.reflect.Array;
import java.util.EmptyStackException;
public class StackArray <T> implements Stack<T>{
private int maxSize;
private T[] array;
private int top;
public StackArray(int maxSize) {
this.maxSize = maxSize;
// @SuppressWarnings("unchecked")
this.array = (T[]) Array.newInstance(StackArray.class, maxSize);
this.top = -1;
}
private T[] resizeArray() {
/**
* create a new array double the size of the old, copy the old elements then return the new array */
int newSize = maxSize * 2;
T[] newArray = (T[]) Array.newInstance(StackArray.class, newSize);
for(int i = 0; i < maxSize; i++) {
newArray[i] = this.array[i];
}
return newArray;
}
public boolean isEmpty() {
return top == -1;
}
public boolean isFull() {
return top == maxSize-1;
}
public void push(T element) {
if(!this.isFull()) {
++top;
array[top] = element;
}
else {
this.array = resizeArray();
array[++top] = element;
}
}
public T pop() {
if(!this.isEmpty())
return array[top--];
else {
throw new EmptyStackException();
}
}
public T peek() {
return array[top];
}
}
這是Main類
package stack;
public class Main {
public static void main(String[] args) {
String word = "Hello World!";
Stack <Character>stack = new StackArray<>(word.length());
// for(Character ch : word.toCharArray()) {
// stack.push(ch);
// }
for(int i = 0; i < word.length(); i++) {
stack.push(word.toCharArray()[i]);
}
String reversedWord = "";
while(!stack.isEmpty()) {
char ch = (char) stack.pop();
reversedWord += ch;
}
System.out.println(reversedWord);
}
}
錯誤是
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Character
at stack.StackArray.push(StackArray.java:40)
at stack.Main.main(Main.java:14)
第40行是推送方法
array[top] = element;
方問:有什么方法可以抑制構造函數中的警告? :)
根本問題是類型擦除。 這意味着Stack
類的實例在運行時不知道它的類型參數。 這就是為什么你不能在這里使用最自然的解決方案, array = new T[maxSize]
。
您已嘗試通過使用Array.newInstance(...)
創建數組來解決此問題,但不幸的是,此數組也沒有類型為T
元素。 在顯示的代碼中,元素的類型為StackArray
,這可能與您的意圖不同。
處理此問題的一種常見方法是在內部對Stack
使用Object
數組,並在訪問器方法中將任何返回值強制轉換為類型T
class StackArray<T> implements Stack<T> {
private int maxSize;
private Object[] array;
private int top;
public StackArray(int maxSize) {
this.maxSize = maxSize;
this.array = new Object[maxSize];
this.top = -1;
}
// ... lines removed ...
public T pop() {
if(this.isEmpty())
throw new EmptyStackException();
return element(top--);
}
public T peek() {
if(this.isEmpty())
throw new EmptyStackException();
return element(top);
}
// Safe because push(T) is type checked.
@SuppressWarnings("unchecked")
private T element(int index) {
return (T)array[index];
}
}
另請注意, resizeArray()
方法中存在一個錯誤,其中maxSize
永遠不會被賦予新值。 你真的不需要跟蹤maxSize
,因為你可以使用array.length
。
我認為當原始代碼中的堆棧為空時peek()
也存在問題。
您的代碼創建StackArray數組,然后您嘗試將Character對象粘貼在其中,就像您這樣做:
static void add(Object arr[], Object o) {
arr[0] = o;
}
public static void main(String[] args) {
StackArray stack[] = new StackArray[1];
Character c = 'x';
add(stack, c);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.