四、栈
1、概念
栈和队列类似,不同的是栈遵循 LIFO
(last-in-first-out
)的原则,即最后一个入栈的元素,最先被取出
来
2、常用方法
- push。入栈
- pop。出栈
- peek。看一下栈顶的元素
3、示例
【1】数组栈
class ArrayStack<T> {
private final int length;
private Object[] array;
private int top; // 指向栈顶的前一个位置
public ArrayStack(int length) {
this.length = length;
this.array = new Object[this.length];
this.top = -1;
}
public void push(T element) {
if (isFull()) {
return;
}
array[++top] = element;
}
@SuppressWarnings("unchecked")
public T pop() {
if (isEmpty()) {
return null;
}
return (T)array[top--];
}
@SuppressWarnings("unchecked")
public T peek() {
if (isEmpty()) {
return null;
}
return (T)array[top];
}
public boolean isFull() {
return top == length - 1;
}
public boolean isEmpty() {
return top == -1;
}
@Override
public String toString() {
if (isEmpty()) {
return "[]";
}
StringBuilder sBuilder = new StringBuilder("[");
for (int i = top; i > 0; i--) {
sBuilder.append(array[i]).append(',').append(' ');
}
sBuilder.append(array[0]).append(']');
return sBuilder.toString();
}
}
【2】链表栈
class LinkedStack<T> {
private final int length;
private Node<T> top;
private int size;
public LinkedStack(int length) {
this.length = length;
this.top = null;
this.size = 0;
}
public void push(T element) {
if (isFull()) {
return;
}
Node<T> add = new Node<T>(element);
add.next = top;
top = add;
this.size++;
}
public T pop() {
if (isEmpty()) {
return null;
}
Node<T> node = this.top;
this.top = node.next;
this.size--;
return node.element;
}
public T peek() {
if (isEmpty()) {
return null;
}
return this.top.element;
}
public boolean isFull() {
return size == length;
}
public boolean isEmpty() {
return this.top == null;
}
private static class Node<T> {
private T element;
private Node<T> next;
public Node(T element) {
this.element = element;
}
@Override
public String toString() {
return (null != element) ? element.toString() : "null";
}
}
@Override
public String toString() {
if (isEmpty()) {
return "[]";
}
StringBuilder sBuilder = new StringBuilder("[");
Node<T> node = this.top;
while (true) {
sBuilder.append(node.element);
if (null == node.next) {
break;
}
node = node.next;
sBuilder.append(',').append(' ');
}
sBuilder.append(']');
return sBuilder.toString();
}
}
4、应用
【1】中缀表达式
中缀表达式即我们日常计算时使用的表达式算法,例如 1 + 2 * ( 3 / 4.5 )