0

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

4

5 回答 5

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);
}
于 2012-11-17T09:42:36.103 回答
1

如果您不想或不能stack以所需的方式使用,首先您应该认为do you really need stack?例如使用queuedeque代替可能会更好stack,这样您可以更好地控制它!

于 2012-11-17T09:44:23.697 回答
1

如果您想以任何顺序访问元素,为什么首先使用堆栈?

直接使用std::vectoror std::deque,然后像这样向后迭代

for (auto iter = vec.rbegin(); iter != vec.rend(); ++iter) {
    process(*iter);
}

如果你真的需要,有一种 hackish 但正确的方法来访问stack's 的底层容器对象。

请参阅:如何方便地打印出 std::stack 或 std::queue 中的所有元素

于 2012-11-17T09:44:49.237 回答
0

一般来说,您不应该这样做。

选择一个专门用于限制您访问其内容的容器然后说您确实想要该访问权限是不合适的。

最好选择为满足您的需求而构建的容器。在这种情况下使用 adeque似乎更合适。

但是,如果您想要做一些愚蠢的事情,这就是您直接访问堆栈成员的方式(请注意,这不会使用大量额外内存和时间来构建临时反向堆栈,因为一些其他答案建议):

#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可能是与您的堆栈一起使用的更可取的容器。

于 2012-11-17T09:48:50.537 回答
-1

要反转输出,请使用这个简单的递归函数(伪代码)

  void recursiveWalk(Node* current)
  {
       if (current->next != NULL)
           recusiveWalk(current->next);
        // do stuff here
  }

  //call passing top
  recursiveWalk(stack->top);

这将以相反的顺序建立堆栈。当您在最后一个元素上时,调用堆栈将开始展开,允许您从底部到顶部对堆栈进行操作。

于 2012-11-17T09:44:13.867 回答