在堆栈中搜索特定元素

Posted

技术标签:

【中文标题】在堆栈中搜索特定元素【英文标题】: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)的薄包装器,它有意限制对除顶部之外的所有元素的访问。您想消除该限制,因此只需使用顺序访问容器(向量、双端队列或列表)。 【参考方案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()

【讨论】:

以上是关于在堆栈中搜索特定元素的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中,在 DOM 中搜索特定元素是一种好习惯吗?

在一个数组中搜索特定元素并复制另一个数组中的整个对应行

在 ArrayList 中搜索特定对象

spring-data-elasticsearch 在多个索引中搜索特定字段

如何在子目录中搜索特定文件?

如何在jtree中搜索特定节点并使该节点展开。?