后放进去的先拿,还是先排队的先走
这一课只练一件事:分清 的 和 的 。必会:选对容器、完成 、说出入队出队顺序。最小示例:用栈检查 ([]);边界是空栈,以及错配 ([)]。建议掌握:队列适合一层一层往外看,这是 。n 个括号扫一遍大约 O(n),常见测试点能通过。图上的完整 BFS、最短路、单调栈是拓展。这里不会在浏览器里运行 C++。
任务 1:先选出栈和队列差在哪、括号该用哪个
按 工作, 按 工作。 要用栈:后出现的左括号要先配上。点不认识的词可看基础解释。
必会:能说出两种容器的进出顺序,并判断括号该用栈。这里不会在浏览器里运行 C++,只练习选择和走过程。
栈和队列差在哪?进出顺序 · 必会
检查括号是否匹配,该用哪个?括号匹配 · 必会
任务 2:按顺序用栈检查 ([])
最小示例:字符串 ([])。按顺序点三步:先从空栈开始,再读入 ( 和 [,最后用 ] 弹出 [、用 ) 弹出 (,栈空就匹配。对照:队列入队 1, 2, 3 后,出队仍是 1, 2, 3。这里不会在浏览器里运行 C++。
必会:能解释每一步为什么入栈或出栈。边界:还没读字符时栈是空的;不要跳过先读 ([ 这一步。n 个括号扫一遍大约 O(n),常见测试点能通过。
- stack<char> st;
- string s = "([])";
- // 空栈:st.empty() == true
- st.push('('); st.push('[');
三步走完了,现在亲手把弹栈那一行敲出来:读到 ] 时栈顶是 [, 要求最后压进去的先弹掉。下面是只读脚手架,只留一空给你敲键盘。
- stack<char> st;
- string s = "([])";
- st.push('('); st.push('['); // 先读 ( 再读 [,现在栈顶是 '['
- if (st.top() != '[') { cout << "不匹配"; return 0; } // 读到 ']',先看栈顶
- ; // 配上了,弹掉栈顶
- if (st.empty()) cout << "匹配";
st.pop(); // 弹出栈顶的 '[',剩下的 '(' 等下一个 ')' 来配
任务 3:核对空栈,并认出错配 ([)]
建议掌握:还没读任何括号时栈是空的。现在 ([]) 已经匹配。如果改成 ([)],读到 ) 时栈顶是 [,配不上。队列对照:入队 1, 2, 3 后,出队顺序仍是 1, 2, 3。一层一层看邻居是 。
必会 / 建议掌握 / 拓展:必会是选对容器、完成括号匹配、说出入队出队顺序。建议掌握是队列可以一层一层看。图上 BFS、最短路、单调栈是拓展,现在不用当硬门槛。
- // 空栈:还没读字符,st.empty() == true
- // 正确:([]) 配完后栈空
- // 错误:([)] 读到 ) 时栈顶是 [
- // 图上 BFS、最短路、单调栈是拓展
先选出空栈长什么样:
再选出 ([)] 为什么不匹配:
任务 4:随机小测,看看你是否真的懂了
每次从本课题库抽出三道不同的选择题。题目与解析已通过校验,答完后看解析,不要只看分数;拿不准就回到对应任务再看一遍。