想要利用两个栈实现一个队列, 首先我们需要搞清楚栈和队列的特性, 栈是后进先出, 是一个压栈的过程, 而队列则是先进先出的一个过程.
用两个栈去实现一个队列, 该怎样做, 首先假如我们有一组数据 7 5 9 2,
然后我们需要一个栈
stack<int> m_s1;
将这组数据压入栈中, 如下图所示
既然是用栈去实现队列, 那也就是说, 我们需要利用栈去实现一个头删的功能, 并且我们可以取到队列头的数据.
这个时候我们就要用到第二个栈了
stack<int> m_s2;
在第一个栈中循环取栈顶压入第二个栈中并删除, 直至第一个栈中只剩下一个数据. 如下图
然后将最后一个数据删除, 这时第一个栈为空, 这个时候我们其实已经完成了头删的一部分, 一定要注意, 我们不能破坏原来的队列数据(利用栈实现的队列), 所以接下来我们要做的是, 再将第二个栈中的数据不断取栈顶压入栈一中.如图:
此时我们就实现了对数据进行头删的过程, 即用两个栈模拟实现了队列的头删.
接下来想要取到队列头的数据(也就是此时栈底的数据)类似于上面的过程, 只是我们需要一个临时变量来保存这个栈底的数据, 再将栈二的数据压回栈一
#include <iostream>
#include <stack>
using namespace std;
//两个栈实现一个队列
class stackQueue
{
stack<int> m_s1;
stack<int> m_s2;
public:
stackQueue()
{
}
void push(int i)
{
m_s1.push(i);
}
void pop()
{
while (m_s1.size() > 1)
{
m_s2.push(m_s1.top());
m_s1.pop();
}
m_s1.pop();
while (!m_s2.empty())
{
m_s1.push(m_s2.top());
m_s2.pop();
}
}
int front()
{
while (m_s1.size() > 1)
{
m_s2.push(m_s1.top());
m_s1.pop();
}
int tmp = m_s1.top();
while (!m_s2.empty())
{
m_s1.push(m_s2.top());
m_s2.pop();
}
return tmp;
}
int back()
{
return m_s1.top();
}
};
int main()
{
stackQueue sq;
sq.push(2);
sq.push(3);
sq.push(4);
cout << sq.front() << endl;
sq.pop();
cout << sq.front() << endl;
sq.pop();
cout << sq.front() << endl;
system("pause");
return 0;
}