这是一篇来自考试试卷的问题我被困在下面我已经附上了这个问题,虽然我不能完成我已经做了一些。
问题:
使用以下类的堆栈和队列类定义编写一个模板化函数reverseQueue(?),它将一个指向队列的指针作为参数,并使用堆栈对象(或指向堆栈对象的指针)来反转给定的队列。对reverseQueue的函数调用应该反转作为参数传递的队列的数据。 [提示:只需在reverseQueue(?)函数中调用下面给出的适当方法。您不必为下面给出的堆栈和队列类/方法编写实现代码。只需阅读每种方法的用途,并根据您的需要使用它们。]
template <class T>
struct NODE {
NODE<T> *pNext;
T Data;
};
template <class T>
class stack{
private:
NODE<T> * top;
public:
stack();
~stack();
void push (T data); //pushes a new node with data type //T in a stack
bool pop (T &data); //pops out the top most node from //the stack
void printStack(); //prints all elements of a stack
};
template <class T>
class queue {
private:
NODE<T> * front;
NODE<T> * tail;
public:
queue ();
~queue();
bool dequeue ( T & data); //removes first node from //a queue
bool enqueue (T val); //appends a new node in a //queue
};
我的答案是不完整的,因为我无法继续下面是我的答案,无论我做了什么
template <class T>
void reverseQueue(queue <T> *ptr){
stack <T> *stackptr= new stack<T>;
T temp;
while(ptr->front !=NULL){
temp=ptr->Data;
ptr->dequee(ptr->Data);
stackptr->push(temp);
}
// incomplete code
}
如果有人能给出答案那么好
答案 0 :(得分:5)
假设输入队列看起来像
1 2 3 4
^ ^
front back
如果我们从中取出物品,我们将获得1,2,3,4。
现在假设我们将这些物品放入堆叠中,然后我们将它们出列 它看起来像这样:
4 <- top
3
2
1 <- bottom
如果我们弹出这些,我们将获得4,3,2,1。
现在,如果我们将它们从队列中弹出队列,我们将获得
4 3 2 1
^ ^
front back
与原始队列相反。
这样的事情应该这样做:
template <class T>
void reverseQueue(queue <T> *q){
stack <T> s;
T temp;
// First build a stack (LIFO queue) from the (FIFO) queue.
while (q->dequeue(temp))
{
s.push(temp);
}
// The first item in the queue is now at the bottom of the stack.
// The last item is at the top.
// The queue is empty.
// If we enqueue them again they will be reversed.
while (s.pop(temp))
{
q->enqueue(temp);
}
}
答案 1 :(得分:0)
template <class T>
void reverseQueue(queue<T> *q_ptr)
{
stack<T> *stack_ptr = new stack<T>();
T temp;
while(true)
{
if (q_ptr.dequeue(temp))
{
stack_ptr->push(temp);
}
else
{
break;
}
}
while(true)
{
if (stack_ptr->pop(temp))
{
q_ptr.push(temp);
}
else
{
break;
}
}
delete stack_ptr;
}