- 定义
栈是GetItem、ListInsert、ListDelete操作限制只能发生在表尾的线性表。
- 术语
表头 - 栈底,表尾 - 栈顶,插入 - 压栈,删除 - 出栈 - 特点
先进后出(Last In First Out)
栈是线性表的特例,插入的位置是length+1,删除的位置的是length,一般也只读取第length数据元素。
栈的应用
括号匹配
https://leetcode.com/problems/valid-parentheses/description/
Description
Given a string containing just the characters ‘(’, ‘)’, ‘{’, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
- An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
- Example 1
Input: “()”
Output: true - Example 2
Input: “()[]{}” – Output: true - Example 3
Input: “(]” – Output: false - Example 4
Input: “([)]” – Output: false - Example 5
Input: “{[]}” – Output: true
堆栈实现
时间复杂度O(n),空间复杂度O(n)
- 思路
- 从左到右扫描字符串,取出第一个字符C,如果是左括号就压栈;如果是右括号就出栈;否则不匹配,停止。
- 重复1直到字符串为空。
- 如果栈不为空则不匹配。
class Solution {
// Hash table that takes care of the mappings.
private HashMap<Character, Character> mappings;
// Initialize hash map with mappings. This simply makes the code easier to read.
public Solution() {
this.mappings = new HashMap<Character, Character>();
this.mappings.put(')', '(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public boolean isValid(String s) {
// Initialize a stack to be used in the algorithm.
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// If the current character is a closing bracket.
if (this.mappings.containsKey(c)) {
// Get the top element of the stack. If the stack is empty, set a dummy value of '#'
char topElement = stack.empty() ? '#' : stack.pop();
// If the mapping for this bracket doesn't match the stack's top element, return false.
if (topElement != this.mappings.get(c)) {
return false;
}
} else {
// If it was an opening bracket, push to the stack.
stack.push(c);
}
}
// If the stack still contains elements, then it is an invalid expression.
return stack.isEmpty();
}
}
函数调用
数值转换
算术表达式求值
参考资料
https://leetcode.com/problems/valid-parentheses/description/