我想编写一个将队列元素复制到堆栈中的代码,这些复制的元素应该在堆栈中排序。 我已经编写了以下代码:
#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,代码似乎不起作用。 请帮我解决我的代码问题。
答案 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())