繁体   English   中英

C ++中队列的反向

[英]reverse of a queue in c++

这是我被困在下面的一个试卷中的一个问题,尽管我无法完成,但我已经完成了其中的一些问题。

题:

使用堆栈和队列类的以下类定义编写模板化的函数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
} 

如果有人可以给出答案,那将是很好的

假设输入队列看起来像

 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);
    }
} 
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;
} 
  • 运行时复杂度:O(n)+ O(n)= O(2 * n)〜O(n)
  • 空间复杂度:stack_ptr的O(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM