1.抽象数据类型
/**
*
* 栈接口
*
*/
public interface Stack {
//返回堆栈大小
public int getSize();
//判断是否为空
public boolean isEmpty();
//e入栈
public void push(Object e);
//栈顶元素出栈
public Object pop() throws StackEmptyException;
//取栈顶元素
public Object peek() throws StackEmptyException;
}
class StackEmptyException extends RuntimeException{
public StackEmptyException(String err) {
super(err);
}
}
2.栈的顺序存储实现
/**
*
* Stack的顺序存储实现
*
*/
public class StackArray implements Stack {
private final int LEN = 8;//默认
private Object[] elements;
private int top;//栈顶指针
public StackArray() {
top = -1;
elements = new Object[LEN];
}
@Override
public int getSize() {
return top+1;
}
@Override
public boolean isEmpty() {
return top<0;
}
@Override
public void push(Object e) {
if(getSize() >= elements.length){
expandSpace();
}
elements[++top] = e;
}
private void expandSpace(){
Object[] a = new Object[elements.length*2];
for(int i=0;i<elements.length;i++){
a[i] = elements[i];
}
elements = a;
}
@Override
public Object pop() throws StackEmptyException {
if(getSize() < 1){
throw new StackEmptyException("错误,堆栈为空");
}
Object obj = elements[top];
elements[top--] = null;
return obj;
}
@Override
public Object peek() throws StackEmptyException {
if(getSize() < 1){
throw new StackEmptyException("错误,堆栈为空");
}
return elements[top];
}
}
3.栈的链式存储实现
/**
*
* 栈的链式存储
*
*/
public class StackSLinked implements Stack {
private SLNode top;//首结点
private int size;
public StackSLinked() {
top = null;
size = 0;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public void push(Object e) {
SLNode q = new SLNode(e,top);
top = q;
size++;
}
@Override
public Object pop() throws StackEmptyException {
if(size < 1){
throw new StackEmptyException("错误,堆栈为空");
}
Object obj = top.getData();
top = top.getNext();
size--;
return obj;
}
@Override
public Object peek() throws StackEmptyException {
if(size < 1){
throw new StackEmptyException("错误,堆栈为空");
}
return top.getData();
}
}
2184

被折叠的 条评论
为什么被折叠?



