Java中的堆栈有例外

时间:2009-09-08 22:14:51

标签: java exception stack

问题:

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];
  }
}

5 个答案:

答案 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[] 作为实例变量。
  • 使用类的构造函数来启动具有给定大小的数组作为构造函数的参数。您必须检查此大小是否在(10到1000)范围内
  • 制作两个实例方法 push pop 。您可以使用整数变量作为指向当前数组位置的指针,因此在调用push时增加它,并在调用pop时减少它。你必须确保这个指针不超过限制(即不低于零,并且不会高于大小)。

答案 4 :(得分:0)

再次阅读您的问题并查找您尚未完成的所有事情。

  • 你还没有输入方法pop
  • 您没有遵循示例pop()
  • 给出的例外示例
  • 您没有正确检查范围
  • 您还没有编写实例化堆栈并对其进行测试的主要方法