美文网首页js css html
日拱一卒:栈(Stack)

日拱一卒:栈(Stack)

作者: Tinyspot | 来源:发表于2023-02-02 07:22 被阅读0次

1. 栈(Stack)

  • 栈是一种特殊的线性表,运算受限
  • 栈有两种储存方式,顺序栈和链式栈
public class Stack<E> extends Vector<E> {
    public E push(E item) {
        addElement(item);
        return item;
    }

    // 出栈,弹出栈顶元素,并将栈顶元素返回
    public synchronized E pop() {
        E       obj;
        int     len = size();
        obj = peek();
        removeElementAt(len - 1);
        return obj;
    }

    // 获取栈顶元素
    public synchronized E peek() {
        int     len = size();
        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }
}

2. 手写栈

2.1 方式一:继承 ArrayList

缺点:可以调用父类的 add(), get(index), 实际并不应该对外提供

public class MyStack<E> extends ArrayList<E> {
    public void push(E element) {
        add(element);
    }
    public E pop() {
        return remove(size() - 1);
    }
    public E peek() {
        return get(size() - 1);
    }
}

测试

MyStack<Integer> stack = new MyStack<>();
stack.push(1);

2.2 方式二:组合方式

public class MyStack<E> {
    // 组合方式,ArrayList 作为一个属性
    private List<E> list = new ArrayList<>();
    public void push(E element) {
        list.add(element);
    }
}

3. 练习

3.1 Leetcode 20 括号序列

  • 3 种括号 () {} []

方式一:用字符串处理

public static boolean check(String s) {
    // 此处是 while 循环,只要还有能匹配的字符就会一直循环
    while (s.contains("{}") || s.contains("()") || s.contains("[]")) {
        s = s.replace("{}", "");
        s = s.replace("()", "");
        s = s.replace("[]", "");
    }
    return s.isEmpty();
}

方式二:使用栈

  1. 左括号入栈,右括号出栈并比较
  2. 所有字符比较完后,栈应该为空
/**
 * check("{[()]}")
 * 1. 遇见左字符直接入栈
 * 2. 遇见右字符开始比较
 * 3. 注意判断左字符多于右字符的情况 {{[()]}
 */
public static boolean check(String s) {
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
        if (c == '{' || c == '[' || c == '(') {
            stack.push(c);
        } else {
            // isEmpty 没有左字符了,可能是本身就没有,或出栈完了
            if (stack.isEmpty()) return false;

            char left = stack.pop();
            if (c == '}' && left != '{') return false;
            if (c == ']' && left != '[') return false;
            if (c == ')' && left != '(') return false;
        }
    }
    // 所有字符扫描完后,判断stack.isEmpty,避免左括号多于右括号判断出错
    return stack.isEmpty();
}

补充:其他获取字符的方式

public static boolean check(String s) {
    Stack<Character> stack = new Stack<>();
    int len = s.length();
    for (int i = 0; i < len; i++) {
        char c = s.charAt(i);
        // ...
    }
    return stack.isEmpty();
}

3.2 浏览器的前进后退

  • 用两个栈实现

相关文章

  • 日拱一卒:栈(Stack)

    1. 栈(Stack) 栈是一种特殊的线性表,运算受限 栈有两种储存方式,顺序栈和链式栈 2. 手写栈 2.1 方...

  • 日拱一卒英语社群复盘ing

    相 信 我,你 并 不 孤 独。 日拱一卒启动仪式1-4合集 日拱一卒”英语社群入群作业 日拱一卒启动仪式1-4合...

  • 日拱一卒

    日拱一卒是一个成语,完整的表述是:日拱一卒,功不唐捐。源于《法华经》 :“日拱一卒无尽有,功不唐捐终入海”。 会下...

  • 2017-10-11

    持之以恒,日拱一卒。

  • 2017-10-11

    持之以恒,日拱一卒。

  • 今晚,信仰

    如题,日拱一卒

  • 感觉要重新开始写作了

    按兴趣日拱一卒

  • 坚持还是放弃?取舍之间彰显大智慧。

    今天看到一段话,感觉写的更好,分享给大家。“日拱一卒”源于《法华经》:日拱一卒,功不唐捐——日拱一卒无有尽,功不唐...

  • 日拱一卒

    日拱一卒 任务0(12月11日) 最近刚加入这个“日拱一卒”的社群,名字非常好,学英文就...

  • 无题

    日拱一卒,功不唐捐。

网友评论

    本文标题:日拱一卒:栈(Stack)

    本文链接:https://www.haomeiwen.com/subject/pxqwhdtx.html