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来构建栈!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义