如何在C ++中直接访问堆栈元素?

时间:2012-11-17 09:38:40

标签: c++

由于某种原因,我必须使用堆栈来实现某些功能,但我需要反转输出堆栈的元素。所以我想使用stack<char,vector<char>来实现直接访问,但我的建议可能会有一些错误。任何人都可以告诉我如何使用STL堆栈有效地反转C ++中输出堆栈的元素吗?

5 个答案:

答案 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::vectorstd::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);

这将以相反的顺序构建堆栈。当你在最后一个元素上时,调用堆栈将开始展开,允许你从下到上操作堆栈。