2011-09-07 50 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。