搜索堆栈中的特定元素

时间:2012-01-18 22:58:30

标签: c++ search data-structures stack

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

std::stack<char> myStack

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

4 个答案:

答案 0 :(得分:8)

C ++ stack不支持随机访问,因此没有直接方法使用stack来检查是否包含元素。但是,您可以复制堆栈,然后连续pop关闭该堆栈,直到找到该元素。

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

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

如果您需要经常搜索stack,请考虑将setstack保持一致,并stack存储与set::find相同的元素。这样,您只需使用{{1}}来检查(有效)元素是否存在。

希望这有帮助!

答案 1 :(得分:3)

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

答案 2 :(得分:0)

由于您希望实现DFS和BFS,因此使用std::stack(对于DFS)和std::queue(对于BFS)确实适合保留尚未访问的节点,并且您只需要使用{{这些容器的1}}和push()方法。

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

答案 3 :(得分:0)

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

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()