栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表,因此,可称为限定性的数据结构。限定它仅在表尾进行插入或删除操作。表尾称为栈顶,相应地,表头称为栈底。栈的基本操作除了在栈顶进行插入和删除外,还有栈的初始化,判空以及取栈顶元素等。
题解报告LeetCode#71:简化路径
思路:
一句话解释,栈解决,把当前目录压入栈中,遇到`..`弹出栈顶,最后返回栈中元素。
代码:
class Solution {
public String simplifyPath(String path) {
Deque<String> stack = new LinkedList<>();
for (String item : path.split("/")) {
if (item.equals("..")) {
if (!stack.isEmpty()) stack.pop();
} else if (!item.equals(".") && !item.equals("")) {
stack.push(item);
}
}
String ans = "";
for (String item : stack) {
ans = "/" + item + ans;
}
return ans.isEmpty() ? "/" : ans;
}
}
题解报告LeetCode#150:逆波兰表达式求值
思路:用栈,试一下 switch,在这里代码更规范些
代码:
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new ArrayDeque<>();
for (String t : tokens) {
switch (t){
case "+":
stack.push(stack.pop() + stack.pop());
break;
case "-":
int num = stack.pop();
stack.push(stack.pop() - num);
break;
case "*":
stack.push(stack.pop() * stack.pop());
break;
case "/":
int num2 = stack.pop();
stack.push(stack.pop() / num2);
break;
default:
stack.push(Integer.valueOf(t));
}
}
return stack.pop();
}
}
题解报告LeetCode#844:比较含退格的字符串
思路:
通过栈来构造去除了退格符和被删除字符后的字符栈,然后比较它们是否相等。
代码:
class Solution {
public boolean backspaceCompare(String S, String T) {
Stack<Character> stack1 = build(S);
Stack<Character> stack2 = build(T);
if (stack1.size() != stack2.size()) {
return false;
}
while (!stack1.isEmpty()) {
if (stack1.pop() != stack2.pop()) {
return false;
}
}
return true;
}
private Stack<Character> build (String S) {
Stack<Character> stack = new Stack<>();
for (char c : S.toCharArray()) {
if (c == '#') {
if (!stack.isEmpty()) {
stack.pop();
}
}else {
stack.push(c);
}
}
return stack;
}
}