Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来
Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用
- E push(E item)
- 把项压入堆栈顶部。
- E pop()
- 移除堆栈顶部的对象,并作为此函数的值返回该对象。
- E peek()
- 查看堆栈顶部的对象,但不从堆栈中移除它。
- boolean empty()
- 测试堆栈是否为空。
- int search(Object o)
- 返回对象在堆栈中的位置,以 1 为基数。
Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?
答案只能从源代码中寻找,jdk1.6:
通过peek()方法注释The object at the top of this stack (the last item of the Vector object,可以发现数组(Vector)的最后一位即为Stack的栈顶
pop、peek以及search方法本身进行了同步
push方法调用了父类的addElement方法
empty方法调用了父类的size方法
Vector类为线程安全类
综上,Stack类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)
设计一个有getMin 功能的栈
private Stack <Integer> stackData ; private Stack <Integer> stackMin ; public getMinStack(){ this.stackData = new Stack <Integer> (); this.stackMin = new Stack <Integer> (); } public void push(int newNum){ if(stackMin.isEmpty()){ stackMin.push(newNum); }else if(newNum>this.getMin()){ stackMin.push(newNum); } stackData.push(newNum); } public int pop(){ if(stackMin.isEmpty()){ throw new RuntimeException("stack is empty"); } int value= stackData.pop(); if(value==this.getMin()){ stackMin.pop(); } return value; } public int getMin(){ if(stackMin.isEmpty()){ throw new RuntimeException("stack is empty"); } return stackMin.peek(); }