刚才做题碰到了这个有意思的题。
两个栈实现队列是《剑指offer》上的题,大家之前或许都有做过。
但这道题有意思在栈的容量是受限的,求的是容量。
这道题应该再深入的思考下,
首先,到底如何用两个栈实现队列。
大家都知道栈是FILO,队列是FIFO。可真正该实现的是时候就不是简简单单的想 着把一个栈里的数据,存入另一个栈中,这样再取出来就是先进的先出了。
关键问题是何时将一个栈中的数据存入另一个栈。
栈和队列的关键操作是push()
和pop()
,前者负责压入一个数据,后者负责弹出。还有个top()
/front()
分别取栈顶/队首元素。那应该如何用俩栈实现队列的push()
呢?
class DemoQueue
{
stack<int> s1, s2;
public:
void push(int val)
{
// s2.push(val); 直接存入第二个栈等着pop()? 连着存多个push()不就跟stack一样了么,显然不行。
s1.push(val);
// s2.push(val) 每push一次都要更新s2以使pop()能正常pop()? 显然也不行,要知道pop()的关键是要保证s2的top()时刻都是队列的队首
}
//所以其实push只需压入数据给第一个栈就好了。
void pop()
{
//那pop()就需要下功夫,要知道客户有可能在任何时候调用pop()
if (s1.empty() && s2.empty())
throw "Wtf";
//首先,如果s2没有任何数据,那就