【问题标题】:Searching for a particular element in a stack在堆栈中搜索特定元素
【发布时间】:2012-02-13 16:21:34
【问题描述】:

我有兴趣将 this Python code 移植到 C++。作为端口的一部分,我使用来自<stack> 标头的std::stack。如何确定某个字符是否包含在 stack<char> 中?例如:

std::stack<char> myStack

if (!('y' is included in myStack)) // I know that this is wrong
{
}

【问题讨论】:

  • 请问你为什么用stack而不是set?
  • 无法迭代/查找std::stack,您只能查看最后推送的项目并将其弹出。您可能需要另一个容器。
  • 如果您想查看所有元素,您可能不需要堆栈。
  • 在 C++ 中,堆栈只是围绕顺序访问容器(默认为std::deque)的薄包装器,它有意限制对除顶部之外的所有元素的访问。您想消除该限制,因此只需使用顺序访问容器(向量、双端队列或列表)。

标签: c++ search data-structures stack


【解决方案1】:

C++ stack 不支持随机访问,因此无法直接使用stack 来检查是否包含元素。但是,您可以制作堆栈的副本,​​然后不断地pop 离开该堆栈,直到找到该元素。

或者,如果您确实需要搜索stack,您可以考虑使用支持随机访问的deque。例如,您可以在 deque 上使用 find 算法来搜索元素:

find(myDeque.begin(), myDeque.end(), myValue);

如果您需要频繁搜索stack,请考虑将set 与存储与stack 相同的元素的stack 保持平行。这样,您可以只使用set::find 来(有效地)检查元素是否存在。

希望这会有所帮助!

【讨论】:

  • 我写 else if (!(std::find(myStack.begin(), myStack.end(), x))) 并给我错误 no operator "!"匹配此操作符。是否有任何 find 函数可以返回 bool 或使这种情况发生?
  • find 函数返回一个迭代器而不是布尔值。你会写 if (std::find(myStack.begin(), myStack.end(), x) != myStack.end()) { ... }
【解决方案2】:

如果您需要在容器中查找元素,根据定义,stack 是不符合您需求的容器。您提供的信息量极少,vectordeque 听起来就像它们会提供您需要的界面 (std::find(c.begin(), c.end(), item);)。

【讨论】:

  • 我使用了else if (!(find(visited.begin(), visited.end(), x)))else if (!(find_if(visited.begin(), visited.end(), x))) 它给了我错误no operator "!"匹配此操作符如果找到该项目,我如何返回 true ?
【解决方案3】:

既然你想实现DFS和BFS,使用std::stack(DFS)和std::queue(BFS)确实适合保留尚未访问的节点,你只需要使用push()和@987654324 @这些容器的方法。

但是堆栈和队列不足以保持被访问的节点。我的偏好是使用关联容器,例如std::set,如果你的 C++ 编译器有 unordered_set 更好,因为在关联容器中搜索任意值比在 vectordeque 之类的序列中更快(除非数据在那里排序)。

【讨论】:

  • std::setpoppush 功能吗?我搜索并发现没有这样的功能。有什么建议吗?
  • 对于关联容器,对应的操作是eraseinsert。而且您很可能不需要erase,因为该容器将用于访问节点。因此,该程序将使用一个堆栈/队列供节点访问,并使用一组已访问节点。
【解决方案4】:

如果您需要经常在堆栈中搜索,请考虑在旁边使用集合。始终保持 set 更新:如果任何元素从堆栈中弹出,则将其从 set 中删除,并且在对堆栈进行任何推送操作时,也将其插入到 set 中。

stack<int> st; 
set<int> s;  


//push 
st.push(2);s.insert(2);

//pop
s.erase(st.top()); st.pop();

//find (what your main objective was)
bool ispresent = s.find(2)!=s.end() ; // on failure the iterator = s.end()

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 2021-12-06
    • 2021-05-27
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多