スタックを使用するプログラム用に作成した2つのクラスに問題があります。私が得る最初の問題は、プログラムを実行しようとすると、実行時エラーが発生することです。
それはいくつかのことをしているので、質問するのは難しいことです。スタックに数値を追加するためのユーザー入力を要求し、スタックがいっぱいか空かを確認します。また、アレイをコピーするのに助けが必要かもしれません。
スレッド「メイン」の例外Java.lang.ArrayIndexOutOfBoundsException:-1でIntegerStack.Push(IntegerStack.Java:24)at Lab15.main(Lab15.Java:38)
これは、プログラムを実行するメインクラスです。
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);
}
}
任意の助けや方向が高く評価されます。
Stack実装のより良いソリューション
import Java.util.List;
import Java.util.ArrayList;
public class IntegerStack
{
private List<Integer> stack;
public IntegerStack(int SIZE)
{
stack = new ArrayList<Integer>(SIZE);
}
public void Push(int i)
{
stack.add(0,i);
}
public int pop()
{
if(!stack.isEmpty()){
int i= stack.get(0);
stack.remove(0);
return i;
} else{
return -1;// Or any invalid value
}
}
public int peek()
{
if(!stack.isEmpty()){
return stack.get(0);
} else{
return -1;// Or any invalid value
}
}
public boolean isEmpty()
{
stack.isEmpty();
}
}
配列を使用する必要がある場合...コードの問題と可能な解決策を以下に示します
import Java.util.Arrays;
public class IntegerStack
{
private int stack [];
private int top;
public IntegerStack(int SIZE)
{
stack = new int [SIZE];
top = -1; // top should be 0. If you keep it as -1, problems will arise when SIZE is passed as 0.
// In your Push method -1==0 will be false and your code will try to add the invalid element to Stack ..
/**Solution top=0; */
}
public void Push(int i)
{
if (top == stack.length)
{
extendStack();
}
stack[top]= i;
top++;
}
public int pop()
{
top --; // here you are reducing the top before giving the Object back
/*Solution
if(!isEmpty()){
int value = stack[top];
top --;
return value;
} else{
return -1;// OR invalid value
}
*/
return stack[top];
}
public int peek()
{
return stack[top]; // Problem when stack is empty or size is 0
/*Solution
if(!isEmpty()){
return stack[top];
}else{
return -1;// Or any invalid value
}
*/
}
public boolean isEmpty()
{
if ( top == -1); // problem... we changed top to 0 above so here it need to check if its 0 and there should be no semicolon after the if statement
/* Solution if(top==0) */
{
return true;
}
}
private void extendStack()
{
int [] copy = Arrays.copyOf(stack, stack.length); // The second parameter in Arrays.copyOf has no changes, so there will be no change in array length.
/*Solution
stack=Arrays.copyOf(stack, stack.length+1);
*/
}
}
コンストラクターでtop
変数を_-1
_に初期化したため、配列にアクセスする前にPush()
メソッドでtop
変数をインクリメントする必要があります。 _++top
_を使用するように割り当てを変更したことに注意してください。
_public void Push(int i)
{
if (top == stack.length)
{
extendStack();
}
stack[++top]= i;
}
_
それはあなたが投稿したArrayIndexOutOfBoundsException
を修正します。コードには他の問題もありますが、これは宿題なので、「読者のための演習」として残しておきます。 :)
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
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
public class Stack {
int[] arr;
int MAX_SIZE;
int top;
public Stack(int n){
MAX_SIZE = n;
arr = new int[MAX_SIZE];
top=0;
}
public boolean isEmpty(){
if(top ==0)
return true;
else
return false;
}
public boolean Push(int ele){
if(top<MAX_SIZE){
arr[top] = ele;
top++;
return true;
}
else{
System.out.println("Stack is full");
return false;
}
}
public void show(){
for(int element:arr){
System.out.print(element+" ");
}
}
public int size(){
return top;
}
public int peek(){
if(!isEmpty()){
int peekTest = arr[top-1];
return peekTest;
}
else{
System.out.println("Stack is empty");
return 0;
}
}
public int pop(){
if(isEmpty()){
System.out.println("Stack is Emmpty");
return 0;
}
else{
int element = arr[--top];
return element;
}
}
}