2017-08-16 9 views
0

私は3つのケースを使用している場所を作成しています。ケース1はデータを追加し、ケース2はポップし、ケース3は印刷します。Java Utilスタックの固定スタックサイズを作成する方法はありますか

選択肢1を入力してデータを追加すると、問題は解決します。私が出てpopingとき今、私は

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

は、main関数でスタックを作成し、方法

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

このコードは私の問題を解決していますが、私はまだ混乱していますStack size:これを回避するいくつかの作業をしましょう – David

0

あなたstackは、方法stackMethod内のローカル変数です。

はクラス変数として stを作成し、それが動作するはずです:あなたは、forループでスタックを毎回作成している

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'のチェックがまだ必要です - いいえ? –

関連する問題