我有兴趣将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
{
}
答案 0 :(得分:8)
C ++ stack
不支持随机访问,因此没有直接方法使用stack
来检查是否包含元素。但是,您可以复制堆栈,然后连续pop
关闭该堆栈,直到找到该元素。
或者,如果您确实需要搜索stack
,则可以考虑使用支持随机访问的deque
。例如,您可以在find
上使用deque
算法来搜索元素:
find(myDeque.begin(), myDeque.end(), myValue);
如果您需要经常搜索stack
,请考虑将set
与stack
保持一致,并stack
存储与set::find
相同的元素。这样,您只需使用{{1}}来检查(有效)元素是否存在。
希望这有帮助!
答案 1 :(得分:3)
如果您需要在容器中查找元素,根据定义stack
是您的需求的错误容器。您提供的信息极少,vector
或deque
听起来就像提供您需要的界面(std::find(c.begin(), c.end(), item);
)。
答案 2 :(得分:0)
由于您希望实现DFS和BFS,因此使用std::stack
(对于DFS)和std::queue
(对于BFS)确实适合保留尚未访问的节点,并且您只需要使用{{这些容器的1}}和push()
方法。
但是堆栈和队列不足以保持访问的节点。我的偏好是使用关联容器,例如pop()
,如果您的C ++编译器拥有它,则更好std::set
,因为在关联容器中搜索任意值比在unordered_set
或vector
之类的序列中更快(除非是数据)在那里排序)。
答案 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()