栈的特征
栈的应用
- 系统栈
- 括号匹配问题。LeetCode-20。
/**
* 有效字符串需满足:
* - 左括号必须用相同类型的右括号闭合。
* - 左括号必须以正确的顺序闭合。第一个必须是左括号。
*/
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char c = s.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;
}
}
}
// 上面的边界条件都判断后,可能栈中还存在元素,如果存在元素也是false。
return stack.isEmpty();
}
栈的实现
public interface StackInterface<E> {
// push
void push(E e);
// pop
E pop();
// 获取栈中元素个数
int getSize();
// peek
E peek();
// isEmpty
boolean isEmpty();
}
public class ArrayStack<E> implements StackInterface<E> {
private Array<E> array;
private int capacity;
public ArrayStack(int capacity) {
array = new Array(capacity);
}
public ArrayStack() {
this(10);
}
@Override
public void push(E e) {
array.addLast(e);
}
@Override
public E pop() {
E e = array.removeLast();
return e;
}
@Override
public int getSize() {
return array.getSize();
}
@Override
public E peek() {
return array.getLast();
}
@Override
public boolean isEmpty() {
return array.isEmpty();
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("Stack [");
for(int i = 0; i < array.getSize(); i++) {
res.append(array.get(i));
if(i != array.getSize() - 1) {
res.append(",");
}
}
res.append("] top");
return res.toString();
}
}