栈是一种后进先出的线性数据结构,相对于数组,栈对应的操作是数组的子集,只能从一端添加元素,也只能从该端取出元素,这一端称为栈顶。
①无处不在的Undo操作(撤销)
我们在编辑器中打字时,一旦输入错别字,我们可以使用快捷键Ctrl+Z进行撤销操作,即从栈中取出刚刚输入的错别字,这个是栈中的一个基本应用。
②系统调用的系统栈
在我们编程进行子过程调用(递归)的过程中,当一个子过程执行完成之后,可以自动回到上一层调用中断的位置,继续执行下去,其背后的原因就是系统栈会记录每次调用过程中中断的点。
③括号匹配
遍历,将左括号放入栈中,遇到右括号就与栈顶括号比较,若匹配成功则将栈顶括号出栈且继续遍历下一个括号;若匹配失败,则马上可以得出这串括号是不能匹配成功的;若在最后全部遍历结束且栈为空,则说明全部括号可以一一匹配成功。
public static boolean mate(String str) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '[' || c == '{' || c == '(')
stack.push(c);
else {
if (stack.isEmpty())
return false;
char top = stack.pop();
if (c == ']' && top != '[')
return false;
if (c == '}' && top != '{')
return false;
if (c == ')' && top != '(')
return false;
}
}
return stack.isEmpty();
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
(一)定义接口
Stack(E)
①void push(E)
向栈中添加一个元素
②E pop()
拿出栈顶的元素,也就是出栈
③E peek()
查看栈顶的元素
④int getSize()
查看栈中元素个数
⑤boolean isEmpty()
判断栈是否为空
(二)接口的实现类
ArrayStack<E>
导入前面我已经封装好的动态数组Array类,基本操作都是调用该类方法实现的。
从用户角度看,支持这些操作就可以满足用户需求了,具体底层实现用户并不关心,实现底层有多种实现方式,本次我只采用动态数组的复用进行实现,后面我将会用链表来实现。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
import Array.Array;
public class ArrayStack<E> implements Stack<E> {
Array<E> array;
// 构造方法
public ArrayStack(int capacity) {
array = new Array(capacity);
}
// 构造方法
public ArrayStack() {
array = new Array<>();
}
// 获得栈中的元素个数
public int getSize() {
return array.getSize();
}
// 判断栈是否为空
public boolean isEmpty() {
return array.isEmpty();
}
// 获得栈的容量
public int getCapacity() {
return array.getCapacity();
}
// 向栈中添加一个元素
public void push(E e) {
array.addLast(e);
}
// 移除栈顶的元素
public E pop() {
return array.removeLast();
}
// 查看栈顶的元素
public E peek() {
return array.getLast();
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Stack:").append('[');
for (int i = 0; i < array.getSize(); i++) {
sb.append(array.query(i));
if (i != array.getSize() - 1)
sb.append(",");
}
sb.append("] top");
return sb.toString();
}
}