阅读 285

小码哥《恋上数据结构与算法》笔记(五):栈

参考:小码哥数据结构与算法(五):栈

数据结构和算法动态可视化

一、栈

  • 栈是一种特殊的线性表, 只能在一端进行操作。
  • 往栈中添加元素的操作,一般叫做push入栈
  • 从栈中移除元素的操作,一般叫做pop出栈(只能移除栈顶的元素)。
  • 栈的内部实现可以使用动态数组双向链表实现。
  • 栈的主要操作是在尾部添加删除元素。

二、栈的接口设计

public class Stack<E> {
    // 使用动态数组实现栈
    private List<E> list = new ArrayList<>();
    // 元素的数量
    public int size();
    // 是否为空
    public boolean isEmpty();
    // 入栈
    public void push(E element);
    // 出栈
    public E pop();
    // 获取栈顶元素
    public E top();
}
复制代码

三、栈的实现

public class Stack<E> {
    // 使用 动态数组存储数组
    private ArrayList<E> list;
    public Stack() {
        // 初始化方法中创建列表
    	this.list = new ArrayList<>();
    }
    public int size() {
    	// 栈中元素数量, 就是列表中存储的元素数量
    	return list.size();
    }
    public boolean isEmpty() {
    	// 栈是否空, 就是列表是否空
    	return list.isEmpty();
    }
    public void push(E element) {
    	// 入栈, 将元素添加到列表的最后面
    	list.add(element);
    }
    public E pop() {
    	// 出栈, 将列表中最后一个元素删除并返回
    	return list.remove(list.size() - 1);
    }
    public E top() {
    	// 查看栈顶元素, 就是查看列表中的最后一个元素
    	return list.get(list.size() - 1);
    }
    public void clear() {
    	// 清空栈, 就是清空列表
    	list.clear();
    }
}
复制代码

四、leetcode算法题

1、有效的括号

public boolean isValid1(String s) {
    Stack<Character> stack = new Stack<>();
		
    int len = s.length();
    for (int i = 0; i < len; i++) {
        char c = s.charAt(i);
        if (c == '(' || c == '{' || c == '[') { // 左括号
            stack.push(c);
        } else { // 右括号
            if (stack.isEmpty()) return false;
				
            char left = stack.pop();
            if (left == '(' && c != ')') return false;
            if (left == '{' && c != '}') return false;
            if (left == '[' && c != ']') return false;
        }
    }
    return stack.isEmpty();
}
复制代码

2、括号的分数

3、基本计算器

4、逆波兰表达式求值