JAVA 堆栈类(Stack)的使用

堆栈是一种 “后进先出” (LIFO) 的数据结构, 只能在一端进行插入(称为 “压栈” ) 或删除 (称为“出栈”)数据的操作。

JAVA 中,使用 java.util.Stack 类的构造方法创建对象。

public class Stack extends vector

构造方法 : public Stack() 创建一个空 Stack。

1	empty() 测试此堆栈是否为空
2	peek()查看此堆栈顶部对象,不将其删除
3	pop()删除该堆栈的顶部对象,并返回所删除的对象
4	push(E item) 将一个项目推到一个栈的顶部
5	search(Object o) 返回对象在堆栈中的位置,以1为基数 ,o-表示理想对象,返回值是int类型

测试代码

public class StackTest {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Stack stack = new Stack(); // 创建堆栈对象
        System.out.println("11111, absdder, 29999.3 三个元素入栈");
        stack.push(new Integer(11111)); //向 栈中 压入整数 11111
        printStack(stack);  //显示栈中的所有元素
         
        stack.push("absdder"); //向 栈中 压入
        printStack(stack);  //显示栈中的所有元素
         
        stack.push(new Double(29999.3)); //向 栈中 压入
        printStack(stack);  //显示栈中的所有元素
         
        String s = new String("absdder");
        System.out.println("元素absdder在堆栈的位置"+stack.search(s));     
        System.out.println("元素11111在堆栈的位置"+stack.search(11111));
         
        System.out.println("11111, absdder, 29999.3 三个元素出栈"); //弹出 栈顶元素
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);  //显示栈中的所有元素
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);  //显示栈中的所有元素
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);  //显示栈中的所有元素
         
 
    }
     
    private static void printStack(Stack stack){
        if (stack.empty())
            System.out.println("堆栈是空的,没有元素");
            else {
                System.out.print("堆栈中的元素:");
                Enumeration items = stack.elements(); // 得到 stack 中的枚举对象
                while (items.hasMoreElements()) //显示枚举(stack ) 中的所有元素
                    System.out.print(items.nextElement()+" ");
            }
        System.out.println(); //换行
    }
}

结果:

 1 11111, absdder, 29999.3 三个元素入栈
 2 堆栈中的元素:11111 
 3 堆栈中的元素:11111 absdder 
 4 堆栈中的元素:11111 absdder 29999.3 
 5 元素absdder在堆栈的位置2
 6 元素11111在堆栈的位置3
 7 11111, absdder, 29999.3 三个元素出栈
 8 元素29999.3出栈
 9 堆栈中的元素:11111 absdder 
10 元素absdder出栈
11 堆栈中的元素:11111 
12 元素11111出栈
13 堆栈是空的,没有元素

从源码中我们可以看到上述三个方法的具体实现都是通过调用父类Vector里的方法实现的。为了实现线程安全,peek()和pop()加上了同步锁,push()没有添加是因为只调用了Vector中的addElement(E item)方法,这个方法是加锁的。

然而正因为Stack继承自Vector,Stack类已经不被官方推荐使用!!

基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要扩容。Vector 是由数组实现的集合类,它包含了大量集合处理的方法。而 Stack 之所以继承 Vector,是为了复用 Vector 中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是 Stack 设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承 Vector,Stack 和 Vector 本来是毫无关系的。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨。

官方推荐使用LinkedList来构建栈!!

posted @   河马小海豚  阅读(618)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示