面試題7:用兩個棧實現隊列和用兩個隊列實現一個棧


題目:用兩個棧實現一個隊列。隊列的生命如下,請實現它的兩個函數appendTail和deleteHead,分別完成在隊列尾部插入結點和在隊列頭部刪除結點的功能。

template <typename T>class CQueue
{
public:
  CQueue(void);
  ~CQueue(void);
  void appendtail(const T& node);
  T deleteHead();
private:
  stack<T> stack1;
  stack<T> stack2;
};

解題思路:

插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。

代碼實例:

View Code
#include<iostream>
#include<stdlib.h>
#include<stack>
using namespace std;

template <typename T>class CQueue
{
public:
    CQueue(void);
    ~CQueue(void);
    void appendtail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;

};

//構造函數
template <typename T> CQueue<T>::CQueue(void)
{
}

//析構函數
template <typename T> CQueue<T>::~CQueue(void)
{
}

//插入元素
template <typename T> void CQueue<T>::appendtail(const T& node)
{
    stack1.push(node);
}

//刪除元素並返回
template <typename T> T CQueue<T>::deleteHead()
{
    if(stack2.size()<=0)
    {
        while(stack1.size()>0)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
    }
    if(stack2.size()==0)
        throw new exception("隊列為空");
    T head=stack2.top();
    stack2.pop();
    return head;
}

void main()
{
    CQueue<int> queue;
    queue.appendtail(1);
    queue.appendtail(2);
    queue.appendtail(3);
    queue.appendtail(4);
    int len=4;
    while(len>0)
    {
        cout<<queue.deleteHead()<<endl;
        --len;
    }

    system("pause");
}

使用兩個隊列實現一個棧

參考文獻:

http://hi.baidu.com/ozwarld/blog/item/ec9b52d4d48ce1dc50da4b0f.html

解法:

  1. 有兩個隊列q1和q2,先往q1內插入a,b,c,這做的都是棧的push操作。
  2. 現在要做pop操作,即要得到c,這時可以將q1中的a,b兩個元素全部dequeue並存入q2中,這時q2中元素為a,b,對q1再做一次dequeue操作即可得到c。
  3. 如果繼續做push操作,比如插入d,f,則把d,f插入到q2中,
  4. 此時若要做pop操作,則做步驟2
  5. 以此類推,就實現了用兩個隊列來實現一個棧的目的。

注意在此過程中,新push進來的元素總是插入到非空隊列中,空隊列則用來保存pop操作之后的那些元素,那么此時空隊列不為空了,原來的非空隊列變為空了,總是這樣循環。

對於push和pop操作,其時間為O(n).

代碼實例

View Code
#include<iostream>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;

template <typename T>class CStack
{
public:
    CStack(void){};
    ~CStack(void){};
    void push(const T& node);
    T pop();
private:
    queue<T> queue1;
    queue<T> queue2;
    
};

//插入元素
template <typename T> void CStack<T>::push(const T& element)
{
    if(queue1.size()>0)//如果queue1不為空則往queue1中插入元素
        queue1.push(element);
    else if(queue2.size()>0)//如果queue2不為空則往queue2中插入元素
        queue2.push(element);
    else//如果兩個隊列都為空,則往queue1中插入元素
        queue1.push(element);
        
}

//刪除元素
template <typename T> T CStack<T>::pop()
{
    if(queue1.size()==0)//如果queue1為空
    {
        while(queue2.size()>1)//保證queue2中有一個元素,將其余元素保存到queue1中
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        T& data=queue2.front();
        queue2.pop();
        return data;
    }
    else//如果queue2為空
    {
        while(queue1.size()>1)//保證queue2中有一個元素,將其余元素保存到queue1中
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        T& data=queue1.front();
        queue1.pop();
        return data;
    }

}


void main()
{
    CStack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);

    int len=4;
    while(len>0)
    {
        cout<<stack.pop()<<" ";
        --len;
    }

    system("pause");
}

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM