问题:
b)Stack是后进先出(LIFO)数据结构。写一个Java类 Stacklnt使用alray作为私有数据存储一堆整数 结构体。 Stacklnt有:
最大大小,在创建Stacklnt对象时设置。 如果大小超出10到10的范围,则应抛出异常。 1000
方法推送,将值添加到堆栈顶部。例外 如果在调用push时堆栈已满,则应该抛出。
方法pop,用于删除并返回堆栈顶部的值。 如果在弹出时堆栈为空,则应抛出异常 调用。
c)编写一些示例代码,以显示您的类Stacklnt如何从(b)部分 应该使用。包括正常使用的示例以及所有情况 抛出异常。
好的,所以基本上这是一个我试图解决的问题,非常感谢一些帮助。
例外是这种形式
// Throw an exception!
public T pop() throws EmptyStackException
{
if (contents.size() == 0)
{ throw new EmptyStackException(); }
else
{ return contents.remove(0); }
}
我到目前为止:
public class Stack {
private int top;
private int[] storage;
Stack(int capacity) {
if (capacity <= 0)
throw new IllegalArgumentException(
"Stack's capacity must be positive");
storage = new int[capacity];
top = -1;
}
void push(int value) {
if (top == storage.length)
throw new StackException("Stack's underlying storage is overflow");
top++;
storage[top] = value;
}
int peek() {
if (top == -1)
throw new StackException("Stack is empty");
return storage[top];
}
}
答案 0 :(得分:5)
你试图一次完成整个程序,这有点困难,因为可能存在许多琐碎的语法错误,其中任何一个都会导致它无法编译。
所以,建议采取婴儿步骤 - 你可能会听到很多。它是这样的(假设你还没有编写任何代码):
1)编辑StackInt.java文件,使其仅包含以下内容:
class StackInt {
}
2)编译它。
2a)如果编译不正确,请在添加新代码之前先修复这些错误
3)添加少量新代码。比方说,一个main()方法。你的班级现在看起来像这样:
class StackInt {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
4)编译它。然后运行它。如果它不编译,请在继续之前修复这些错误。如果它编译,则运行它。你应该看到它打印出“hello world!”。这告诉你它已成功运行。如果没有输出,那么你就知道错误了,你必须在继续之前解决这个问题。
通过这种方式,您可以选择“婴儿步骤” - 每次只添加少量代码,然后编译并运行它以确保它按您期望的方式工作。
以这种方式做程序对我来说真的很有帮助。您可以一次处理一个方法,而不是键入所有方法并想知道它失败的位置。我推荐它。
编辑:
由于您已经编写了代码,因此您可以通过注释掉大部分代码来调整这种“婴儿步骤”方法,这样您就不会浪费它。使用/ *和* /注释掉整个部分 - 这样编译器会忽略它,你可以一次尝试一件。它看起来像这样:
class StackInt {
/*
this is "commented out"
push(int number) {
}
*/
public static void main(String[] args) {
System.out.println("hello world!");
}
}
希望这有帮助。
答案 1 :(得分:2)
阅读Fundamentals of OOP and Data Structures in Java - Richard Wiener
第11章是关于堆栈和队列的全部内容
答案 2 :(得分:1)
作为您对上一条评论的回答:您的语法不错。我清理了你的代码,一旦你实现了StackException类和pop方法,它应该编译正确:
public class Stack {
private int top;
private int[] storage;
public Stack(int capacity) {
if (capacity <= 0) {
throw new IllegalArgumentException(
"Stack's capacity must be positive");
}
top = -1;
storage = new int[capacity];
}
public void push(int value) {
if (top == storage.length) {
throw new StackException("Stack's underlying storage is overflow");
}
top++;
storage[top] = value;
}
public int peek() {
if (top == -1) {
throw new StackException("Stack is empty");
}
return storage[top];
}
public int pop() {
// TODO
}
}
答案 3 :(得分:0)
这是你应该做的:
Stacklnt
**。int[]
作为实例变量。push
和 pop
。您可以使用整数变量作为指向当前数组位置的指针,因此在调用push
时增加它,并在调用pop
时减少它。你必须确保这个指针不超过限制(即不低于零,并且不会高于大小)。答案 4 :(得分:0)
再次阅读您的问题并查找您尚未完成的所有事情。