将元素从队列复制到堆栈

时间:2018-04-10 19:53:20

标签: c++ sorting data-structures

我想编写一个将队列元素复制到堆栈中的代码,这些复制的元素应该在堆栈中排序。 我已经编写了以下代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,x;
    queue<int> q;
    stack<int> s;
    cin >> n;
    for(int i=0;i<n;i++){
        cin >> x;
        q.push(x);
    }
    while(!q.empty()){
        if(s.empty()){
            s.push(q.front());
            q.pop();
        }
        else{
            if(q.front()>=s.top()){
                s.push(q.front());
                q.pop();
            }
            else{
                while(q.front()<s.top() && !s.empty()){
                    q.push(s.top());
                    s.pop();                    
                }
            }
        }
    }
    while(!s.empty()){
        cout << s.top() << " ";
        s.pop();
    }
    return 0;
}

但对于某些测试用例,例如:3 1 2 3,代码似乎不起作用。 请帮我解决我的代码问题。

2 个答案:

答案 0 :(得分:1)

您的代码似乎在内部while循环中出现逻辑错误。您在测试s.top()之前测试s.empty(),这是错误的顺序。如果s.top()为真,则s.empty()无效。但是,如下所述,练习可以相对容易地解决。

您可以使用以下帮助程序检索容器适配器的基础容器:

template <class ADAPTER>
typename ADAPTER::container_type & get_container (ADAPTER &a)
{
    struct hack : ADAPTER {
        static typename ADAPTER::container_type & get (ADAPTER &a) {
            return a.*&hack::c;
        }
    };
    return hack::get(a);
}

然后,在填充队列之后,您可以将内容直接复制到堆栈的基础容器中,并对其进行排序。

auto &qc = get_container(q);
auto &sc = get_container(s);
sc.assign(qc.begin(), qc.end());
std::sort(sc.begin(), sc.end());

答案 1 :(得分:0)

你必须做的本质上是一个选择排序:通过队列N次,每次选择最大的元素推入堆栈。一般的想法是:

queue = queue containing items
stack = new empty stack
while queue.count > 0
    // push the first item from the queue onto the stack
    stack.push(queue.pop())
    count = queue.count
    // for each item remaining in the queue
    for (i = 0; i < queue.count; ++i)
        // if the item from the queue is larger than what's on the stack,
        // then remove the item from the stack and put it back in
        // the queue. And put the item from the queue onto the stack.
        if (queue.peek() > stack.peek())
            queue.push(stack.pop())
            stack.push(queue.pop())