6

スタックを使用するプログラム用に作成した 2 つのクラスに問題があります。最初の問題は、プログラムを実行しようとすると実行時エラーが発生することです。

それはいくつかのことをしているので、尋ねるのは難しいことです。スタックに数値を追加し、スタックがいっぱいか空かをチェックするためのユーザー入力を求めます。配列をコピーするのにも助けが必要かもしれません。

スレッド「メイン」の例外 java.lang.ArrayIndexOutOfBoundsException: Lab15.main(Lab15.java:38) の IntegerStack.push(IntegerStack.java:24) で -1

これは、プログラムを実行するメイン クラスです。

import java.util.Scanner;


public class Lab15 {

    public static void main(String[] args)
    {
        System.out.println("***** Playing with an Integer Stack *****");
        final int SIZE = 5;
        IntegerStack myStack = new IntegerStack(SIZE);
        Scanner scan = new Scanner(System.in);

        //Pushing integers onto the stack
        System.out.println("Please enter an integer to push onto the stack - OR - 'q' to Quit");
        while(scan.hasNextInt())
        {
            int i = scan.nextInt();
            myStack.push(i);
            System.out.println("Pushed "+ i);
        }

        //Pop a couple of entries from the stack
        System.out.println("Lets pop 2 elements from the stack");
        int count = 0;
        while(!myStack.isEmpty() && count<2)
        {
            System.out.println("Popped "+myStack.pop());
            count++;
        }

        scan.next(); //Clearing the Scanner to get it ready for  further input.

        //Push a few more integers onto the stack
        System.out.println("Push in a few more elements - OR - enter q to quit");
        while(scan.hasNextInt())
        {
            int i = scan.nextInt();
            myStack.push(i);
            System.out.println("Pushed "+ i);
        }

        System.out.println("\nThe final contentes of the stack are:");
        while(!myStack.isEmpty())
        {
            System.out.println("Popped "+myStack.pop());
        }

    }

}

これは、問題のあるスタックに数値を追加するクラスです。これは、配列をコピーするのに助けが必要な場合がある場所です。最後に。

import java.util.Arrays;

public class IntegerStack 
{
    private int stack [];
    private int top; 

    public IntegerStack(int SIZE) 
    {
        stack = new int [SIZE];
        top = -1;
    }

    public void push(int i) 
    {
        if (top == stack.length)
        {
            extendStack();
        }

        stack[top]= i;
        top++;
    }

    public int pop() 
    {
        top --;
        return stack[top];
    }

    public int peek()
    {
        return stack[top];
    }

    public boolean isEmpty() 
    {
        if ( top == -1);
        {
            return true;
        }
    }

    private void extendStack()
    {
        int [] copy = Arrays.copyOf(stack, stack.length);
    }
}

どんな助けや指示もいただければ幸いです。

4

5 に答える 5

1

topコンストラクターで変数を初期化したため、配列にアクセスする前に、メソッドで変数-1をインクリメントする必要があります。使用する割り当てを変更したことに注意してください。toppush()++top

public void push(int i) 
{
    if (top == stack.length)
    {
        extendStack();
    }

    stack[++top]= i;
}

ArrayIndexOutOfBoundsExceptionそれはあなたが投稿したことを修正します。あなたのコードには他の問題も見られますが、これは宿題なので、「読者の演習」として残しておきます。:)

于 2013-04-26T15:29:14.487 に答える
0

Java でのスタックの実装

  class stack
  {  private int top;
     private int[] element;
      stack()
      {element=new int[10];
      top=-1;
      }
      void push(int item)
      {top++;
      if(top==9)
          System.out.println("Overflow");
      else
              {
               top++;
      element[top]=item;

      }

      void pop()
      {if(top==-1)
          System.out.println("Underflow");
      else  
      top--;
      }
      void display()
      {
          System.out.println("\nTop="+top+"\nElement="+element[top]);
      }

      public static void main(String args[])
      {
        stack s1=new stack();
        s1.push(10);
        s1.display();
        s1.push(20);
        s1.display();
        s1.push(30);
        s1.display();
        s1.pop();
        s1.display();
      }

  }

出力

Top=0 Element=10 Top=1 Element=20 Top=2 Element=30 Top=1 Element=20
于 2013-07-08T20:10:54.510 に答える
0

Java でスタックを実装する例 (配列ベースの実装) を次に示します。

public class MyStack extends Throwable{

/**
 * 
 */
private static final long serialVersionUID = -4433344892390700337L;

protected static int top = -1;
protected static int capacity;
protected static int size;

public int stackDatas[] = null;

public MyStack(){
    stackDatas = new int[10];
    capacity = stackDatas.length;
}

public static int size(){

    if(top < 0){
        size = top + 1;
        return size;
    }
    size = top+1;
    return size; 
}

public void push(int data){
    if(capacity == size()){
        System.out.println("no memory");
    }else{
        stackDatas[++top] = data;
    }
}

public boolean topData(){
    if(top < 0){
        return true;
    }else{
        System.out.println(stackDatas[top]);
        return false;
    }
}

public void pop(){
    if(top < 0){
        System.out.println("stack is empty");
    }else{
        int temp = stackDatas[top];
        stackDatas = ArrayUtils.remove(stackDatas, top--);
        System.out.println("poped data---> "+temp);
    }
}

public String toString(){
    String result = "[";

    if(top<0){
        return "[]";
    }else{


    for(int i = 0; i< size(); i++){
        result = result + stackDatas[i] +",";
    }
    }

    return result.substring(0, result.lastIndexOf(",")) +"]";
 }
}

MyStack の呼び出し:

    public class CallingMyStack {

public static MyStack ms;

public static void main(String[] args) {

    ms = new MyStack();
    ms.push(1);
    ms.push(2);
    ms.push(3);
    ms.push(4);
    ms.push(5);
    ms.push(6);
    ms.push(7);
    ms.push(8);
    ms.push(9);
    ms.push(10);
    System.out.println("size: "+MyStack.size());
    System.out.println("List---> "+ms);
    System.out.println("----------");
    ms.pop();
    ms.pop();
    ms.pop();
    ms.pop();
    System.out.println("List---> "+ms);
    System.out.println("size: "+MyStack.size());

 }
}

出力:

size: 10
List---> [1,2,3,4,5,6,7,8,9,10]
----------
poped data---> 10
poped data---> 9
poped data---> 8
poped data---> 7
List---> [1,2,3,4,5,6]
size: 6
于 2015-11-30T09:24:38.317 に答える