您的位置:首页 > 其它

解题笔记(12)——用两个栈实现队列

2015-11-30 23:04 232 查看
问题描述:用两个栈来实现队列,有如下声明:

[cpp] view
plaincopyprint?

template<typename T>

class SQueue

{

public:

SQueue() {}

~SQueue() {}

void PushBack(const T &x);

void PopFront();

private:

stack<T> m_stack1;

stack<T> m_stack2;

};

思路:栈是先进后出,而队列是先进先出。可以这样设计,一个栈用于入队列操作,设为Stack1,另一个栈用于出队列操作,设为Stack2。入队列可以在常数时间内完成,即Stack1的入栈操作。而出队列时,若Stack2的元素不为空,Stack2执行出栈操作,相当于出队列。若为空,则将Stack1的元素一个个出栈,压入Stack2中,然后Stack2再执行一次出栈操作。举个简单的例子。入队列的顺序为1、2、3、4、5,出队列的顺序为1、2、3、4、5。
操作 Stack1自栈顶到栈底的元素 Stack2自栈顶到栈底的元素 出队列的元素
PushBack(1) PushBack(2) PushBack(3) 3 2 1 空
PopFront() 空 2 3
1
PushBack(4) PushBack(5) 5 4 2 3
PopFront() 5 4 3
2
PopFront() 5 4 空
3
PopFront() 空 5
4
PopFront() 空 空
5
参考代码:

[cpp] view
plaincopyprint?

template<typename T>

class SQueue

{

public:

SQueue() {}

~SQueue() {}

void PushBack(const T &x);

void PopFront();

private:

stack<T> m_stack1;

stack<T> m_stack2;

};



template<typename T>

void SQueue<T>::PushBack(const T &x)

{

m_stack1.push(x);

}



template<typename T>

void SQueue<T>::PopFront()

{

if(m_stack2.size() == 0)

{

while(m_stack1.size() > 0)

{

m_stack2.push(m_stack1.top());

m_stack1.pop();

}

}

if(m_stack2.size() > 0)

m_stack2.pop();

}

上面是用两个栈实现队列,其实也可以用两个队列实现栈。有如下声明:

[cpp] view
plaincopyprint?

template <typename T>

class QStack

{

public:

QStack() {}

~QStack() {}

void PushBack(const T &x);

void PopBack();

private:

queue<T> m_queue1;

queue<T> m_queue2;

};

思路:稍微复杂了一点,容易想到的就是这种设计。出栈时,检查两个队列,找到元素个数不为空的那个队列,执行出队列操作。如果是压栈操作,找到元素为空队列Queue1,执行入队列操作,然后Queue2执行出队列操作,出来的元素依次进入Queue1。举个简单的例子。入栈的顺序为1、2、3、4,中间有一次出栈操作,出栈顺序为3、4、2、1.。

操作 Queue1自队首到队尾的元素 Queue2自队首到队尾的元素 出栈的元素
PushBack(1) 1
PushBack(2) 空 2 1
PushBack(3) 3 2 1 空
PopBack() 2 1
3
PushBack(4) 空 4 2 1

PopBack() 空 2 1
4
PopBack() 空 1
2
PopBack() 空 空
1
参考代码:

[cpp] view
plaincopyprint?

template <typename T>

class QStack

{

public:

QStack() {}

~QStack() {}

void PushBack(const T &x);

void PopBack();

private:

queue<T> m_queue1;

queue<T> m_queue2;

};



template <typename T>

void QStack<T>::PushBack(const T &x)

{

if(m_queue1.size() == 0)

{

m_queue1.push(x);

while(m_queue2.size() > 0)

{

m_queue1.push(m_queue2.front());

m_queue2.pop();

}

}

else

{

m_queue2.push(x);

while(m_queue1.size() > 0)

{

m_queue2.push(m_queue1.front());

m_queue1.pop();

}

}

}

template <typename T>

void QStack<T>::PopBack()

{

if(m_queue1.size() > 0)

m_queue1.pop();

else if(m_queue2.size() > 0)

m_queue2.pop();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: