我在使用C 中的堆栈时经常发现这种怪异,我不确定问题的确切根源是什么。可以通过代码段更好地解释:
class MinStack {
private:
stack<int> ans;
stack<int> min_collector;
public:
void push(int x) {
ans.push(x);
if (min_collector.empty() || getMin()>=x) {
min_collector.push(x);
}
}
void pop() {
if (ans.top()==getMin()) {
min_collector.pop();
}
ans.pop();
}
int top() {
return ans.top();
}
int getMin() {
return min_collector.top();
}
};
上面的代码正常工作。但是,在按下(int x)函数中,如果我编辑这样的" if"条件:
(getMin()>=x || min_collector.empty())
我遇到了一个运行时错误,还有其他人遇到了这个问题吗?为什么"或"条件下的订单很重要?
这些条件是从左到右评估的,一旦第一学期返回true
。
对于逻辑 &&
执行中止,一旦第一学期返回 false
。
您会遇到运行时错误,因为在空白时尝试访问堆栈的top()
元素是非法的 - 没有顶部元素。