不使用内置类的Java Stack程序

时间:2016-08-20 20:45:49

标签: java data-structures stack

我试图在不使用java.util提供的内置类的情况下创建堆栈。我编写了这个程序,但它似乎无法正常工作,每当我尝试使用stack.pop()方法时,它似乎并没有真正删除堆栈的第一个元素,而是返回pop:0,I认为这意味着它根本没有删除任何东西。 Stack类包含堆栈的逻辑,即Push,Pop等。

编辑:我看到我混淆了推送和弹出,我现在已将这些更改为推送:top ++和pop:--top。但是,现在我收到了一个ArrayOutOfBounds错误。

EDIT2:好的,这是我正在测试程序的序列。

  1. 输入1以使用堆栈。
  2. 再次输入1尝试推送数字。
  3. 介绍任何数字,比如5。
  4. 键入2以尝试弹出一个数字,但我收到一个ArrayOutOfBoundsError
  5. 代码:

    public class Stack {  
        int[] stack;
        int top;
    
        public Stack() {      
            stack = new int[10];
            top = 0;
        }
    
        public void push(int a) {
            stack[top++] = a;
        }
    
        public int pop() {
            return stack[--top];
        }
    }
    
    public class StacksAndQueues {
        public static void main(String[] args) {
            Scanner sc = new Scanner (System.in);
            int answ = 1;
    
            {
                while (answ != 0) {
                    int operation = 1;
                    System.out.println("Introduce 1 to work with Stacks, 2 to work with Queues or 0 to exit");
                    answ = sc.nextInt();
                    switch (answ) {
                        case 0: 
                            System.out.println("Goodbye");
                            break;                       
    
                        case 1: 
                            while (operation !=0) {
                                Stack stack = new Stack();
                                System.out.println("Introduce 1 to push a number, 2 to pop a number, 3 to display contents and 0 to go back");
                                operation = sc.nextInt();
                                switch (operation) {
                                    case 0:
                                        break;
    
                                    case 1:  
                                        System.out.println("Introduce the number you want to push");
                                        int num = sc.nextInt();
                                        stack.push(num);
                                        break;
    
                                    case 2:
                                        System.out.println("Pop: " + stack.pop());
                                        break;
    
                                    default: 
                                        System.out.println("Error: Invalid answer, please try again");break;
                                }                       
                            }
                            break;                     
                        }  
                    }
                }
            }    
        }
    

2 个答案:

答案 0 :(得分:1)

考虑堆栈为空时会发生什么(即top == 0):因为您使用的是预先递增的top值,所以您当前将值存储到元素1中,而不是元素0中。

改为使用top++,以便在将top推进到1之前将值放入元素0中。

同样,在弹出时,如果堆栈中有一个元素(top == 1),则需要返回元素0.因此,请改用--top

答案 1 :(得分:0)

stack顶部插入数据之前,您正在递增顶部索引。 在从stack弹出数据之后,您正在递减顶部索引。

所以代码应该是这样的....

public void push(int a) {
  stack[top++] = a;
 }
public int pop() {
  return stack[--top];
 }

尝试举例并在纸上形象化整个过程。然后很容易让你清楚。