使用pop()和push()的堆栈数组

我有一个问题,我为一个使用堆栈的程序创建了2个类。 我得到的第一个问题是,当我尝试运行程序时,我收到运行时错误。 这是一件很难问的事,因为它做了几件事。 它要求用户输入将数字添加到堆栈并检查堆栈是已满还是空。 我也可能需要帮助来复制数组。

线程“main”java.lang.ArrayIndexOutOfBoundsException中的exception:在Lab15.main的IntegerStack.push(IntegerStack.java:24)处为-1(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 stack; public IntegerStack(int SIZE) { stack = new ArrayList(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(); } } 

如果必须使用Array …以下是代码中的问题和可能的解决方案

 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中的堆栈实现

  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

以下是在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