面试题中,用两个栈来实现一个队列是一个经常被问到的问题。这个题的主要思想是一个栈用来插入,另一个栈用来转出,在转出前,如果转出栈为空,则必须将插入栈内的元素先放到转出栈中,然后弹出元素,如果不为空,则直接将转出栈内的元素弹出即可。
而插入则没有这么多繁琐的步奏,直接向插入栈中插入元素即可
看代码。
#include <iostream>
#include <stack>
using namespace std;
class queue
{
public:
queue()
{};
~queue()
{}
bool appendTail(int key)
{
st1.push(key);
}
int deleteHead()
{
if ( !st2.empty())
{
while ( !st1.empty())
{
st2.push(st1.top());
st1.pop();
}
}
int ret = st2.top();
st2.pop();
return ret;
}
private:
stack<int> st1;
stack<int> st2;
};
int main()
{
queue qu;
qu.appendTail(10);
qu.appendTail(1);
qu.appendTail(14);
qu.appendTail(15);
qu.appendTail(17);
cout<<qu.deleteHead()<<endl;
cout<<qu.deleteHead()<<endl;
cout<<qu.deleteHead()<<endl;
cout<<qu.deleteHead()<<endl;
cout<<qu.deleteHead()<<endl;
return 0;
}
这个题还有一个陷阱就是插入了一部分元素,但是并没有将这些元素全部弹出,又进行插入。这时就是考虑转出栈的转出过程。上面也有叙述。