题目:
用两个栈实现一个队列 队列的声明如下 请实现它的两个函数appendTail 和deleteHead 分别完成在队列尾部插入结点和队列的头部删除结点的功能
栈中元素先进后出
队列中元素先进先出
假设队列q ,元素1 2 3 先后进入队列
1 | 2 | 3 |
如果栈s1 中 1 2 3 先后进入栈
3 |
2 |
1 |
若队列q 中 队头元素1 出队列 则 队列中元素为
2 | 3 |
如果从栈s1中想要弹出 元素1 则需先弹出元素 2 和3 那么可以借助栈s2 将s1中元素弹出 并 压入s2 中
1 |
2 |
3 |
此时s1中弹出1 2 3 后为空 s2的栈顶元素为1 弹出1 ~ 若继续删除队头 元素2 则 从s2中弹出 2~ s2剩下元素3
因此 删除一个元素时 我们可以在栈s2不为空的时候弹出栈顶元素 在栈s2为空时 将先进入队列的元素 即压入栈s1中的元素 弹出 压入s2 ,s1栈低的元素即为最先进入队列的元素 因此 又可以弹出s2的栈顶元素
若队尾插入元素4 则q中剩余元素 2,3,4
3 | 4 |
栈s1为空 将元素4压入s1 则 删除队头元素3 按照上述的删除方法 弹出s2的栈顶元素 如果继续删除队头元素4 则 s2为空 将s1元素压入到s2中后 s2栈顶为4 弹出4 即为要从队列删除的元素
因此 加入一个元素时 我们可以将其压入到s1中
#include <iostream>
#include <stack>
using namespace std;
template<typename T>class CQueue
{
public:
CQueue();
~CQueue();
void appendTail(const T&node );
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T> CQueue<T>::CQueue()
{
}
template<typename T> CQueue<T>::~CQueue()
{
}
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)
{
T &t=stack1.top();
stack1.pop();
stack2.push(t);
}
}
if(stack2.size()==0)
throw std::exception("Error~");
T head=stack2.top();
stack2.pop();
return head;//返回队头元素
}
int main()
{
CQueue<char> Q;
Q.appendTail('a');
Q.appendTail('b');
Q.appendTail('d');
cout<<Q.deleteHead()<<endl;
cout<<Q.deleteHead()<<endl;
cout<<Q.deleteHead()<<endl;
Q.appendTail('e');
cout<<Q.deleteHead()<<endl;
return 0;
}