数据结构和算法(五)–栈(Stack)
什么是栈
-
栈是一种特殊的线性表,只能在一端进行操作
-
往栈中添加元素,一般叫做push,入栈
-
往栈中移除元素,一般叫做pop,弹栈/出栈(只能移除栈顶元素)
-
栈遵循后进先出原则,Last In First Out,LIFO
-
注意:这里所说的“栈”和内存中的“栈空间”是两个不同的慨念,不能混为一谈
栈的接口设计
- int size();
获取长度 - boolean isEmpty();
判断是否为空 - void push(E e);
入栈,把元素存入栈中 - E pop();
弹栈,出栈,返回并移除栈顶元素 - E top();
获取栈顶元素
栈的代码实现
- 栈可以用之前学过的数据结构(List)来实现
- CustomLinkedList请看 《数据结构和算法(二)–单向(循环)链表(LinkedList)》
/**
* @author maolin yuan
* @version 1.0
* @date 2021/5/31 13:29
*/
public class CustomStack<E> {
private final CustomLinkedList<E> STACK = new CustomLinkedList<>();
public int size(){
return STACK.size();
}
public boolean isEmpty(){
return size() == 0;
}
public void push(E e){
STACK.add(e);
}
public E pop(){
if (isEmpty()){
throw new RuntimeException("stack not have element");
}
return STACK.remove(STACK.size() - 1);
}
public E top(){
if (isEmpty()){
return null;
}
return STACK.get(STACK.size() - 1);
}
public static void main(String[] args) {
CustomStack<Integer> stack = new CustomStack<>();
System.out.println(stack.size());
System.out.println(stack.isEmpty());
System.out.println(stack.top());
try {
System.out.println(stack.pop());
}catch (Exception e){
System.out.println(e.getMessage());
}
for (int i = 0; i < 100; i++) {
stack.push(i);
System.out.println(stack.size());
}
System.out.println("========");
while (!stack.isEmpty()){
System.out.println(stack.pop());
}
}
}
练习
1.有效括号
- 链接:https://leetcode-cn.com/problems/valid-parentheses/
- 思路:遍历字符串,遇到左括号就入栈,遇到右括号就弹栈出来和此括号进行对比,当所有都匹配数量也对的上则所有括号都有效
- 代码实现:
class Solution {
public boolean isValid(String s) {
Stack<Character> characters = new Stack<>();
char[] chars = new char[s.length()];
s.getChars(0,s.length(),chars,0);
for (char c: chars) {
if (c == '(' || c == '{' || c == '['){
characters.push(c);
}else if (c == ')' || c == '}' || c == ']'){
if (characters.isEmpty()){
return false;
}
Character pop = characters.pop();
if ((pop == '(' && c != ')') || (pop == '{' && c != '}') || (pop == '[' && c != ']')){
return false;
}
}
}
return characters.isEmpty();
}
}