2011-09-07 54 views
1
import java.util.Iterator; 
import java.util.Stack; 

public class StackExample { 

    public static void main(String args[]){ 

     Stack<String> sk = new Stack<String>(); 

     sk.push("Hello"); 
     sk.push("Hello1"); 
     sk.push("Hello2"); 
     sk.push("Hello3"); 

     System.out.println("The Values of Stack" +sk); 

     Iterator it=sk.iterator(); 

     System.out.println("Size before pop() :"+sk.size()); 

     while(it.hasNext()) 
     { 
      String iValue=(String)it.next(); 
      System.out.println("Iterator value :"+iValue); 
     } 

     String value =(String)sk.pop(); 

     System.out.println("value :"+value); 

     System.out.println("Size After pop() :"+sk.size()); 



    } 

} 

任何人都可以解釋我下面的問題。在Java中很少有堆棧相關的問題

while(it.hasNext()){ 
      String iValue=(String)it.next(); 
      System.out.println("Iterator value :"+iValue); 
} 
  1. 爲什麼我們反覆以這種方式又是什麼的hasNext和next 嗎?我可以做一個for循環嗎?

    String value =(String)sk.pop(); 
    
  2. 什麼的(字符串)sk.pop指...爲什麼它不能編譯,當我 刪除(字符串)

  3. 誰能帶我到一些很好的和複雜的協議棧的例子在Java中

+0

3.我從來沒有見過堆棧使用,除了在Java開發12年的作業風格問題。 –

回答

2

1.爲什麼我們反覆以這種方式和什麼是hasNextnext呢?我可以做一個for循環嗎?

next獲取從迭代器的下一個值,並hasNext告訴你是否有下一個值可用。

是的,你可以爲循環做一個相同的:

for (String str: sk) 
    System.out.println(str); 

應該做的,例如作爲罰款。

2.什麼的(String)sk.pop手段......爲什麼它不是當我刪除(字符串)

當你彈出堆棧的元素編譯,爲您免除「頂部」(最後插入)元素。 (String)部分是。如果pop返回Object和(您知道它實際上是String)並且您想要將其存儲在String引用中,則這是十分必要的。

3,任何人都可以導致我一些很好的和複雜的協議棧的例子在Java中

複雜堆棧的例子嗎?呃,不,我不能。一個堆棧基本上提供了非常簡單的push和pop。無論這個例子是什麼,它會因爲除了使用棧之外的東西而變得複雜,這不會幫助你更好地理解棧:-)

3

廣告1:這是一個標準的Java Iterator。而且,由於Stack implementans Iterable可以簡單的寫:

for (String item : sk) 
{ 
    System.out.println(item); 
} 

廣告2。:鑄造到String是必需的,因爲Iterator被聲明爲不具有泛型類型(這是一種不好的做法)。試用:

Iterator<String> it=sk.iterator(); 

鑄造不再需要。

廣告3:這是寫在10分鐘內一個簡單的例子:

public static void validateXml(String xml) { 
    Stack<String> tags = new Stack<String>(); 
    for (String tag : xml.split("\\s")) 
     if(tag.startsWith("</")) { 
      if (tags.isEmpty()) 
       throw new IllegalArgumentException("No start tag matching: " + tag); 
      final String startTag = tags.pop(); 
      if (!startTag.substring(1).equals(tag.substring(2))) 
       throw new IllegalArgumentException("Start tag: " + startTag + " does not match end tag: " + tag); 
     } else 
      tags.push(tag); 
    if (!tags.isEmpty()) 
     throw new IllegalArgumentException("No end tag matching: " + tags); 
} 

用法:

validateXml("<a> <b> </b> <c> <d> </d> <e> </e> </c> </a>"); 
validateXml("<a> <b> </b> <c> <d> <e> </d> </e> </c> </a>"); //fails to validate 
2

堆棧是一個 「傳統」 集合,它從向量擴展。兩者都來自Java 1.0的舊時代。 因爲Vector方法是同步的,所以使用它並不是一個好主意。 相反,您可以使用最新的Deque接口,例如ArrayDeque或LinkedList。