【问题标题】:Finding element in stl stack cpp在stl堆栈c ++中查找元素
【发布时间】:2016-07-03 23:40:57
【问题描述】:

我需要在堆栈中找到一个元素,所以我发现我必须弹出元素,直到我找到这个元素或堆栈为空。换句话说,当找到元素或堆栈为空时不会弹出。我的思维方式有什么问题?

while (!(stack.top()==searched || stack.empty()))
{
    tmp.push(stack.top());
    stack.pop();
}

如果堆栈不计算搜索到的元素,则代码返回核心转储,但如果 stack.top()==searched 始终返回 0,并且 stack.empty 返回 1,1 OR 0 仍为 1; !1=0 和 'while' 应该停止。 有没有办法做到这一点?我愿意接受建议。

【问题讨论】:

  • 反转 while 条件中表达式的顺序。您不应该在空堆栈上调用 stack.top(),但在检查第二个表达式之前您不知道它是空的。
  • 不是重复的。任何想法如何避免查看空堆栈的问题?
  • 如果您查看我的链接,您会发现建议的答案(双端队列上的std::find)正是您所需要的。如果您的堆栈为空,deque::begindeque::end 将是相同的,因此 std::find 将返回 deque::end,就像在任何其他未找到该元素的情况下一样。
  • imo 如果您需要在堆栈中查找项目,则不应使用堆栈。使用vector 并将其视为堆栈,然后您可以使用std::find

标签: c++ search stl stack


【解决方案1】:

您的代码似乎依赖于short circuit evaluation。但是,它的工作方式是这样的

cond_a || cond_b

首先评估cond_a,然后才评估cond_b以防万一。那么,在这种情况下,您的代码只会在检查top 之后检查堆栈是否为空,这显然是一个错误。您应该颠倒您的两个内部条件的顺序。

【讨论】:

  • 非常感谢,但我们不要得意忘形 :-) 祝你好运!
猜你喜欢
  • 2015-03-26
  • 2021-12-20
  • 2018-09-11
  • 1970-01-01
  • 2013-12-06
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多