栈是限制插入和删除只能在一个位置上进行的表,该位置就是栈顶top。基本操作有push和pop。由于栈是一个表,任何实现表的方式都能实现栈。一种是单链表。一种是数组。
一、主要应用
- 平衡符号,编译器检查程序的语法错误。
- 后缀表达式的计算
- 中缀到后缀的转换
- 方法调用
一般使用一个栈来去除递归。并且编译器在转变成汇编语言时会去除递归。
二、栈在java中的使用
//新建一个栈
stack<Integer> stack = new Stack<Integer>();
具有的函数
//构造方法
stack():创建一个空栈
//其它函数
empty()
peek():查看栈顶对象,但不移除
pop():移除栈顶对象
push()
search(Object o):返回对象在堆栈中的位置,以1为基数
三、用数组实现一个栈
//顺序栈
public class SequenceStack implements Stack {
Object[] stack; //对象数组(栈用数组来实现)
final int defaultSize = 10; //默认最大长度
int top; //栈顶位置(的一个下标):其实可以理解成栈的实际长度
int maxSize; //最大长度
//如果用无参构造的话,就设置默认长度
public SequenceStack() {
init(defaultSize);
}
//如果使用带参构造的话,就调用指定的最大长度
public SequenceStack(int size) {
init(size);
}
public void init(int size) {
this.maxSize = size;
top = 0;
stack = new Object[size];
}
//获取栈顶元素
@Override
public Object peek() throws Exception {
// TODO Auto-generated method stub
if (empty()) {
throw new Exception("堆栈为空!");
}
return stack[top - 1];
}
//判断栈是否为空
@Override
public boolean empty() {
// TODO Auto-generated method stub
return top == 0;
}
//出栈操作
@Override
public Object pop() throws Exception {
// TODO Auto-generated method stub
if (empty()) {
throw new Exception("堆栈为空!");
}
top--;
return stack[top];
}
//入栈操作
@Override
public void push(Object obj) throws Exception {
// TODO Auto-generated method stub
//首先判断栈是否已满
if (top == maxSize) {
throw new Exception("堆栈已满!");
}
stack[top] = obj;
top++;
}
}
四、Stack源码实现的主要函数
public
class Stack<E> extends Vector<E> {
/**
* Creates an empty Stack.
*/
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;
}
}