Java中很少有Stack相关的问题

时间:2011-09-07 08:50:47

标签: java

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());



    }

}

任何人都可以向我解释以下问题。

while(it.hasNext()){
            String iValue=(String)it.next();
            System.out.println("Iterator value :"+iValue);
}
  1. 为什么我们以这种方式迭代以及hasNext和next接下来是什么 做?我可以不用for循环做同样的事。

    String value =(String)sk.pop();
    
  2. (String)sk.pop是什么意思...为什么我不编译 删除(String)

  3. 任何人都可以引导我使用Java中的一些优秀而复杂的Stack示例

3 个答案:

答案 0 :(得分:3)

广告1:这是标准的Java Iterator。由于Stack实现了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

答案 1 :(得分:2)

  

1。为什么我们以这种方式迭代以及hasNextnext做了什么?我不能用for循环做同样的事。

next 从迭代器中提取下一个值,hasNext告诉您是否是否有下一个值。< / p>

是的,您可以使用for循环执行相同的操作:

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

应该做得很好。

  

2。 (String)sk.pop意味着什么......当我删除(字符串)

时,为什么它不能编译

弹出堆栈元素时,删除“top”(最后插入)元素。 (String)部分是演员。如果pop返回Object并且(您知道它实际上是String)并且您希望将其存储在String引用中,则必须这样做。

  

第3。任何人都可以引导我使用Java中的一些优秀而复杂的Stack示例

复杂的堆栈示例?嗯,不,我不能。堆栈基本上提供推送和弹出,这非常简单。无论示例是什么,由于除了使用堆栈之外的其他东西,它将是复杂的,这将无助于您更好地理解堆栈: - )

答案 2 :(得分:2)

Stack是一个“遗留”集合,它从Vector扩展而来。两者都来自Java 1.0的旧时代。 使用它不是一个好主意,因为Vector方法是同步的。 相反,您可以使用最新的Deque接口,例如,ArrayDeque或LinkedList。