2017-03-29 79 views
1

我已經在使用Stack什麼使用類型爲TOKEN,現在我想先使用堆棧創建並初始化新的StackJava - 如何初始化堆棧使用另一個現有堆棧?

首先,我認爲C#的代碼,例如

Stack<Token> e_infixTokens = new Stack<Token>(infixTokens);

C#的堆棧constuctor使用其他堆棧參數,但我認爲Java沒有。我對嗎?

所以,這裏是開始我的代碼部分,

private Stack<Token> infixTokens; 
private Stack<Token> postfixTokens; 

Formula(String formula){ 
    this.formula = formula; 
    this.infixTokens = new Stack<>(); 
    this.postfixTokens = new Stack<>(); 

而下幾行字,我用這個說法。

Stack<Token> e_infixTokens = new Stack<>(infixTokens); 

它發生錯誤。錯誤信息是:

棧(在堆棧)不能被施加到java.util.Stack中

+0

不完全清楚你要找的。你希望新堆棧('e_infixTokens')與'infixTokens'一樣是'Stack'嗎?或者你想製作一個新的'Stack',它是'infixTokens'的副本?對於非C#用戶來說,一些說明會很好。 –

+0

嘗試閱讀正在使用的類的javadoc。你有一個所有可用的方法和方法列表。 – GhostCat

回答

0

一個簡單的方法是這樣的。

Stack<String> stackCopy = (Stack<String>) stack1.clone(); 

該方法來自java.util.Vector.clone(),所以它可能是一個快速實現。

另一個是這樣的,測試後它非常慢。

Stack<String> stackCopy = new Stack<String>(); 
for (String string : stack) { 
    stackCopy2.add(string); 
} 

如下片段比較兩種方法的性能由另一現有棧初始化棧。

public static void main(String[] args) throws Exception { 

    Stack<String> stack = new Stack<String>(); 
    for (int i = 0; i < 1000; i++) { 
     stack.push("" + i); 
    } 


    { 
     Stack<String> stackCopy = null; 
     long time = System.currentTimeMillis(); 
     final int numIterations = 100000; 
     for (int i = 0; i < numIterations; i++) { 
      stackCopy = (Stack<String>) stack.clone(); 
     } 
     System.out.println("stackCopy.get(0) 1 = " + stackCopy.get(0)); 

     long millis = System.currentTimeMillis() - time; 
     System.out.println("Time taken for this: " 
       + (millis > 100000 ? (millis/1000) + " seconds." : millis + " milliseconds.")); 
    } 
    { 
     Stack<String> stackCopy = null; 
     long time = System.currentTimeMillis(); 
     final int numIterations = 100000; 
     for (int i = 0; i < numIterations; i++) { 
      stackCopy = new Stack<String>(); 
      for (String string : stack) { 
       stackCopy.add(string); 
      } 
     } 
     System.out.println("stackCopy.get(0) 2 = " + stackCopy.get(0)); 

     long millis = System.currentTimeMillis() - time; 
     System.out.println("Time taken for this: " 
       + (millis > 100000 ? (millis/1000) + " seconds." : millis + " milliseconds.")); 
    } 
} 

控制檯結果如下:

stackCopy.get(0) 1 = 0 
Time taken for this: 70 milliseconds. 
stackCopy.get(0) 2 = 0 
Time taken for this: 4098 milliseconds. 

此外,調用「添加」並調用「推」的速度在第二方法類似。