Stack是Vector的一个子类,它实现了一个标准的后进先出的栈。
Stack的继承图:
Stack的源码:
public class Stack<E> extends Vector<E> {
public Stack() {
}
public E push(E item) {
addElement(item);
return item;
}
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() {
return size() == 0;
}
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1224463164541339165L;
}
方法说明:
1、boolean empty(): 测试堆栈是否为空。
2、Object peek( ):查看堆栈顶部的对象,但不从堆栈中移除它。
3、Object pop( ):移除堆栈顶部的对象,并作为此函数的值返回该对象。
4、Object push(Object element):把项压入堆栈顶部。
5、int search(Object element):返回对象在堆栈中的位置,以 1 为基数。
简单实用,代码如下:
package com.algorithm.demo;
import java.util.EmptyStackException;
import java.util.Stack;
public class StackDemo {
static void showpush(Stack<Integer> st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<Integer>();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
} catch (EmptyStackException e) {
System.out.println("empty stack");
}
}
运行结果:
stack: []
push(42)
stack: [42]
push(66)
stack: [42, 66]
push(99)
stack: [42, 66, 99]
pop -> 99
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> empty stack
栈的一个小算法应用:
栈还是有他自己的特点的,他也有很多应用,比如在我们的编译原理的课本上给就说过,给定一个字符串表达式通过两个栈来计算这个表达式的值,比如“1+3*(3+6-1)+6”类似于这种的式子,通过符号和数字的压入和弹出,可以计算这个式子,总之合理利用栈,对我们的帮助是非常大的。
相关博文:
Java中栈的解析---内含源码分析
栈和队列的面试题Java