用两个栈实现一个队列的功能。
解题思路
假设两个栈A和B,且都为空。
栈A提供push()
功能,栈B提供pop()
功能。
- 入队列:入栈A。
- 出队列:
- 假设栈B不为空。直接弹出B的元素。
- 假设栈B为空,则依次弹出栈A的元素并压入栈B中,再弹出B中的元素。
实现代码
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class MyQueue
{
public:
void push(const T& t)
{
s1.push(t);
}
void pop()
{
if (s2.empty())
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
s2.pop();
}
T& top()
{
if (s2.empty())
{
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
bool empty() const
{
return s1.empty() && s2.empty();
}
private:
stack<T> s1;
stack<T> s2;
};
int main()
{
MyQueue<int> myque;
for (int i = 0; i < 10; i++)
{
myque.push(i);
}
while (!myque.empty())
{
cout<<myque.top()<<" ";
myque.pop();
}
}
注意:pop()
和top()
中没有再加上if (!s2.empty())
的推断,我觉得此处应该由使用者来推断MyQueue
对象是否为空。降低一些不必要的推断能够提高程序效率。