由于某种原因,我必须使用堆栈来实现某些功能,但我需要反转输出堆栈的元素。所以我想使用stack<char,vector<char>
来实现直接访问,但我的建议可能会有一些错误。任何人都可以告诉我如何使用STL堆栈有效地反转C ++中输出堆栈的元素吗?
答案 0 :(得分:3)
使用临时堆栈。
// On exit the stack 's' will have it's elements reversed.
void reverse_stack(std::stack<int>& s)
{
std::stack<int> tmp;
while (!s.empty())
{
tmp.push(s.pop());
}
s.swap(tmp);
}
答案 1 :(得分:1)
如果您不想或不能以期望的方式使用stack
,首先您应该考虑do you really need stack?
例如,使用queue
或{ {1}}代替deque
,以便您可以更好地控制它!
答案 2 :(得分:1)
如果您想以任何顺序访问元素,为什么要首先使用堆栈?
直接使用std::vector
或std::deque
,然后像
for (auto iter = vec.rbegin(); iter != vec.rend(); ++iter) {
process(*iter);
}
如果你真的需要,那么访问stack
的基础容器对象有一种非常正确但正确的方法。
请参阅:how to print out all elements in a std::stack or std::queue conveniently
答案 3 :(得分:0)
一般情况下,你不应该这样做。
选择一个专门设计用于限制您访问其内容的容器,然后说您确实需要该访问权限,这是不合适的。
最好选择一个满足您需求的容器。在这种情况下,使用deque
似乎更合适。
但是,如果你想要做一些愚蠢的事情,这就是你直接访问堆栈成员的方式(请注意,这不会使用额外的内存和时间来构建一个临时的反向堆栈,如其他一些答案建议):
#include <stack>
#include <deque>
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T, class S>
S& Container(stack<T, S>& q) {
struct HackedStack : private stack<T, S> {
static S& Container(stack<T, S>& q) {
return q.*&HackedStack::c;
}
};
return HackedStack::Container(q);
}
int main()
{
stack<int> st;
deque<int> &mems = Container(st);
cout<<"Putting numbers into the stack"<<endl;
for(int i=0;i<20;i++){
int temp=rand();
cout<<temp<<endl;
st.push(rand());
}
cout<<endl<<"Reading numbers in the stack"<<endl;
for(deque<int>::iterator i=mems.begin();i!=mems.end();i++)
cout<<*i<<endl;
cout<<endl<<"Taking numbers out of the stack"<<endl;
while(!st.empty()){
int temp=st.top();
st.pop();
cout<<temp<<endl;
}
return 0;
}
并且,是的,如果您更改deque
引用的所有vector
引用,这仍然可以正常工作。但是deque
可能是与堆栈一起使用的首选容器。
答案 4 :(得分:-1)
要反转输出,请使用这个简单的递归函数(伪代码)
void recursiveWalk(Node* current)
{
if (current->next != NULL)
recusiveWalk(current->next);
// do stuff here
}
//call passing top
recursiveWalk(stack->top);
这将以相反的顺序构建堆栈。当你在最后一个元素上时,调用堆栈将开始展开,允许你从下到上操作堆栈。