数组栈:压栈、出栈、返回栈顶元素
public interface StackADT<T> {
/**
* 压栈
* */
public void push(T element);
/**
* 出栈
* */
public T pop();
/**
* 返回栈顶元素
* */
public T peek();
public boolean isEmpty();
public int size();
}
public class ArrayStack<T> implements StackADT<T> {
private Object[] data = null;
private Integer maxSize = 0;
private Integer top = -1;
ArrayStack() {
this(10);
}
ArrayStack(int initialSize) {
if (initialSize >= 0) {
this.maxSize = initialSize;
data = new Object[initialSize];
top = -1;
} else {
throw new RuntimeException("初始化大小不能小于0:" + initialSize);
}
}
@Override
public void push(T element) {
if (top != maxSize - 1)
data[++top] = element;
else
throw new RuntimeException("栈已满,压栈失败!");
}
@Override
public T pop() {
if (top != -1)
return (T) data[top--];
else
throw new RuntimeException("栈为空!");
}
@Override
public T peek() {
if (top != -1)
return (T) data[top];
else
throw new RuntimeException("栈为空!");
}
@Override
public boolean isEmpty() {
return top != -1 ? false : true;
}
@Override
public int size() {
return top + 1;
}
@Override
public String toString() {
return top != -1 ? "容量=" + maxSize + "\n栈内容=" + Arrays.toString(data)
+ "\n栈顶元素=" + peek() : "栈为空!";
}
}
链式栈:压栈、出栈、返回栈顶元素
public class LinkStack<T> implements StackADT<T> {
private class Node {
T t;
Node next;
public Node(T t, Node next) {
this.t = t;
this.next = next;
}
}
private Node top;
private int size;
public LinkStack() {
top = null;
}
@Override
public void push(T element) {
top = new Node(element, top);
size++;
}
@Override
public T pop() {
if (isEmpty()) {
throw new RuntimeException("栈为空!");
} else {
Node value = top; // 得到栈顶元素
top = top.next; // 让top引用指向原栈顶元素的下一个元素
value.next = null; // 释放原栈顶元素的next引用
size--;
return value.t;
}
}
@Override
public T peek() {
if (isEmpty())
throw new RuntimeException("栈为空!");
return top.t;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public int size() {
return size;
}
@Override
public String toString() {
return isEmpty() ? "栈为空!" : "LinkStack [top=" + top.t + ", size="
+ size + "]";
}
}
网友评论