2017-08-16 81 views
0

我正在創建一個stck,我使用三種情況。案例1正在添加數據,案例2正在彈出,案例三正在打印。有什麼辦法可以創建Java Util棧的固定堆棧大小

當我輸入選擇1並添加一些數據時,事情進展良好。現在,當我走出坡平我越來越

java.util.EmptyStackException

。如何從這個過來。

事情工作正常,如果我從其他方法創建堆棧。

這是我的代碼。

import java.util.Iterator; 
import java.util.Scanner; 
import java.util.Stack; 

public class SolutionStack { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     for(int i=0; i<n; i++){ 
      int ch = sc.nextInt(); 
      stackMethod(ch); 
     } 

    } 

    private static void stackMethod(int ch) { 
     // TODO Auto-generated method stub 
     Stack st = new Stack(); 
     Scanner sc = new Scanner(System.in); 
     st.size(); 
     System.out.println(st.size()); 
     switch(ch){ 
     case 1: 
      int num = sc.nextInt(); 
      st.push(num); 
      break; 
     case 2: 
      st.pop(); 
      break; 
     case 3 : 
      Iterator<Integer> iterator = st.iterator(); 
      while (iterator.hasNext()) { 
       System.out.println(iterator.next()); 
      } 
     } 

    } 
} 
+1

你爲什麼不使用[空](https://docs.oracle.com/javase/7/docs/api/java/util/ Stack.html#empty())先測試一下? –

+0

請注意,根據Javadoc Deque應優先於Stack。 – Puce

回答

1

你是在創造一個堆棧每次for循環。

在主函數創建堆棧和傳遞方法

Stack st = new Stack(); 

,這將是方法簽名。

private static void stackMethod( Stack st, int ch) 

正確的解決方案將是

import java.util.Iterator; 
import java.util.Scanner; 
import java.util.Stack; 

public class SolutionStack { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Stack st = new Stack(); 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     for(int i=0; i<n; i++){ 
      int ch = sc.nextInt(); 
      stackMethod(st,ch); 
     } 

    } 

    private static void stackMethod(Stack st, int ch) { 
     // TODO Auto-generated method stub 

     Scanner sc = new Scanner(System.in); 
     st.size(); 
     System.out.println(st.size()); 
     switch(ch){ 
     case 1: 
      int num = sc.nextInt(); 
      st.push(num); 
      break; 
     case 2: 
      st.pop(); 
      break; 
     case 3 : 
      Iterator<Integer> iterator = st.iterator(); 
      while (iterator.hasNext()) { 
       System.out.println(iterator.next()); 
      } 
     } 

    } 
} 
+0

這段代碼解決了我的問題,但我仍然對堆棧大小感到困惑:讓我爲此做一些工作 – David

0

stack是在方法stackMethod一個局部變量,所以每次調用一個新的堆棧對象將被創建。

st爲類變量,它應該工作:

import java.util.Iterator; 
import java.util.Scanner; 
import java.util.Stack; 
public class SolutionStack { 

    Stack st = new Stack(); 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     for(int i=0; i<n; i++){ 
      int ch = sc.nextInt(); 
      stackMethod(ch); 
     } 

    } 

    private static void stackMethod(int ch) { 
     // TODO Auto-generated method stub 

     Scanner sc = new Scanner(System.in); 
     st.size(); 
     System.out.println(st.size()); 
     switch(ch){ 
     case 1: 
      int num = sc.nextInt(); 
      st.push(num); 
      break; 
     case 2: 
      st.pop(); 
      break; 
     case 3 : 
      Iterator<Integer> iterator = st.iterator(); 
      while (iterator.hasNext()) { 
       System.out.println(iterator.next()); 
      } 
     } 

    } 
} 
+0

我對此代碼感到困惑。如果'int ch = sc.nextInt();'中的OP進入'2',那麼在'stackMethod'中代碼將是'st.pop()',但是由於堆棧將是空的,將發生相同的錯誤 - 除非OP確保在'2'之前輸入'1',那麼仍然需要檢查'empty' - 否? –