栈具有先进后出的特性。栈和队列一样,同样是一种特殊的列表。本文将介绍栈的基本接口及数组栈、链栈的Java实现。
public interface IStack {
void push(T data); // 入栈
T peek(); // 取栈顶元素
T pop(); // 出栈
int size(); // 长度
boolean isEmpty(); // 是否为空
} public class MyArrayStack implements IStack {
private T[] datas;
int count = 0; // 栈长度,兼栈顶指针
int capacity; // 数组容量
public MyArrayStack(int capacity) {
this.capacity = capacity;
this.datas = (T[]) new Object[capacity];
}
@Override
public void push(T data) {
if (count == capacity)
throw new RuntimeException("栈已满");
this.datas[count++] = data;
}
@Override
public T peek() {
if (isEmpty())
throw new RuntimeException("栈为空");
return datas[count - 1];
}
@Override
public T pop() {
if (isEmpty())
throw new RuntimeException("栈为空");
return datas[--count];
}
@Override
public int size() {
return count;
}
@Override
public boolean isEmpty() {
return count == 0;
}
} public class MyLinkedStack implements IStack {
private class Node {
T data;
Node next;
Node() {}
Node(T data) {
this.data = data;
}
Node(T data, Node next) {
this.data = data;
this.next = next;
}
}
private Node top = new Node(); // 栈顶为top.next
private int count = 0;
@Override
public void push(T data) {
Node node = new Node(data, top.next);
top.next = node;
count++;
}
@Override
public T peek() {
if (isEmpty())
throw new RuntimeException("栈为空");
return top.next.data;
}
@Override
public T pop() {
if (isEmpty())
throw new RuntimeException("栈为空");
T res = top.next.data;
top = top.next;
count--;
return res;
}
@Override
public int size() {
return count;
}
@Override
public boolean isEmpty() {
return count == 0;
}
} 来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4547/viewspace-2808530/ ,如需转载,请注明出处,否则将追究法律责任。