描述:用两个栈实现一个队列。用两个队列实现栈,栈的声明如下,分别实现栈的push()函数和topAnddelete()函数,用来完成在栈的顶部插入和删除(返回栈顶值)的操作
时间:2019-07-31 20:27
类名:CStack
分析
通过一系列的栈的压入和弹出操作来分析用队列模拟一个栈的过程,如图所示,我们先往栈内压入一个元素a。由于两个队列现在都是空,我们可以选择把a插入两个队列中的任一个。我们不妨把a插入queue1。接下来继续网栈内压入b,c两个元素。我们把它们都插入queue1。这个时候 queue1包含3个元素a,b,c其中a位于队列的头部,c位于队列的尾部。
现在我们考虑从栈内弹出一个元素。根据栈的后入先出的原则,最后被压入栈的c应该最先被弹出。由于c位于queue1的尾部,而我们每次只能从队列的头部删除元素,因此我们可以从queueu中依次删除a/b并插入到queue2中,再从queue1中删除c。这就相当于从栈中弹出元素c了。我们可以用同样的方法从栈内弹出元素b。
接下来我们考虑从栈内压入一个元素d.此时queue1已经有了一个元素,我们就把d插入到queue1的尾部。如果我们再从栈内弹出一个元素,此时被弹出的应该是最后被压入的d.由于d位于queue1的尾部,我们只能先从头部删除 queue1的元素并插入到queue2,直到queue1中遇到d再直接把它删除。如图所示:
/*
描述:用两个栈实现一个队列。用两个队列实现栈,栈的声明如下,分别实现栈的push()函数和topAnddelete()函数,
用来完成在栈的顶部插入和删除(返回栈顶值)的操作
时间:2019-07-31 20:27
类名:CStack
*/
template <class T>
class CStack
{
public:
//CStack();
//~CStack();
void appendTail(const T& node);
T topAnddelete();
private:
queue<T> queue1;
queue<T> queue2;
};
template <class T>
void CStack<T>::appendTail(const T& node) //可以选择任意一个队列进行入栈操作
{
queue1.push(node);
}
template <class T>
T CStack<T>::topAnddelete()
{
if (queue1.empty() && queue2.empty())
{//若为空抛出异常
throw exception("the stack is empty");
}
else if (!queue1.empty() && queue2.empty())
{//queue1不为空,queue2为空
while (queue1.size() > 1)
{
T value = queue1.front();
queue2.push(value);
queue1.pop();
}
T r_value = queue1.front(); //此时队列只剩刚进来的元素
queue1.pop();
return r_value;
}
else
{//queue2不为空,queue1为空
while (queue2.size() > 1)
{
T value = queue2.front();
queue1.push(value);
queue2.pop();
}
T r_value = queue2.front();
queue2.pop();
return r_value;
}
}
int main()
{
CStack<string> st;
st.appendTail("a");
st.appendTail("b");
st.appendTail("c");
cout << st.topAnddelete() << endl;
cout << st.topAnddelete() << endl;
cout << st.topAnddelete() << endl;
return 0;
}