栈的实现
在之前的myarraylist和mylinkedlist基础上都可以很方便的实现栈。
栈的特点
先进后出
栈的作用
- 实现递归,调用函数
- 将复杂的计算操作转化为简单的操作(后缀表达式)
学习计算机基本要素可以深入了解栈的作用。
栈顺序实现
直接使用arraylist的add方法加一个代表栈指针的变量即可。
栈链表实现
由于栈不需要索引所以只需要使用单链表即可
public class MyStack<AnyType> {
private int topstack;
private StackNode<AnyType> stackMarker;
//此内部类构建单向链表中的每一个元素
private static class StackNode<AnyType> {
public StackNode( AnyType d, StackNode<AnyType> p ) {
data = d;
prev = p;
}
public AnyType data;
public StackNode<AnyType> prev;
}
//初始化MyStack对象
public MyStack() {
clear();
}
//创建链表的头元素,
public void clear() {
stackMarker = new StackNode( null, null);
topstack = -1;
}
//判断栈是否为空栈
public boolean isEmpty() {
return topstack == -1;
}
//返回现在栈中有几个元素
public int size() {
return topstack + 1;
}
//压入栈中
public void push( AnyType value) {
StackNode<AnyType> oldStack = stackMarker;
StackNode<AnyType> newStack = new StackNode( value, oldStack );
stackMarker = newStack;
topstack++;
}
//弹出栈
public AnyType pop( ) {
if ( isEmpty() )
throw new IndexOutOfBoundsException();
topstack--;
StackNode<AnyType> popStackNode = stackMarker;
AnyType data = popStackNode.data;
stackMarker = stackMarker.prev;
return data;
}
}
测试代码
//测试代码
public static void main(String[] args) {
MyStack test = new MyStack();
test.push("你好");
test.push("世界");
test.push(1);
test.push(2);
test.push(3);
for (int i =0; test.size() != 0; i++ )
System.out.println(test.pop());
}
运行结果
3
2
1
世界
你好
写法分析
链表栈可以不担心栈溢出的问题,顺序栈则要考虑这个问题。