在堆栈中搜索特定元素
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
是不符合您需求的容器。您提供的信息量极少,vector
或 deque
听起来就像它们会提供您需要的界面 (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
更好,因为在关联容器中搜索任意值比在 vector
或 deque
之类的序列中更快(除非数据在那里排序)。
【讨论】:
std::set
有pop
和push
功能吗?我搜索并发现没有这样的功能。有什么建议吗?
对于关联容器,对应的操作是erase
和insert
。而且您很可能不需要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 中搜索特定元素是一种好习惯吗?