版权声明:转载请注明出处!欢迎大家提出疑问或指正文章中的错误! https://blog.csdn.net/pyuxing/article/details/89432149
1-Description
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
2-Solution
1-问题分析
栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop)
队列的特点是先进先出,即第一个被压入队列的元素将会第一个被弹出
下面通过一个具体实例分析如何用两个栈实现一个队列的push以及pop:
- 首先插入一个元素a到stack1,此时stack1中有元素{a},stack2为空,再将b,c压入stack1中,stack1中元素有{a,b,c},此时stack2仍然是空的,如下图所示:
- 此时,我们想从队列弹出一个元素,由于a比b、c要先进入队列,最先被删除的元素应该是a,然而a存于stack1中,并非栈顶因此不可直接弹出。所以这里需要借助于stack2来帮助完成,如果把stack1中的元素逐个压入stack2中,元素在stack2中的元素顺序正好与原来stack1中顺序相反。因此经过3次弹出stack1和压入stack2操作之后,stack1为空,而stack2中元素为{c,b,a},这样就可以弹出stack2栈顶元素a了,如下图所示:
- 接下来再压入一个元素d,由于c、b均早于d进入队列,所以先判断stack2不为空,直接依次弹出b、c,如下图所示:
2-解决代码
依据以上分析,可以写出如下代码:
class Solution
{
public:
void push(int node) {
stack1.push(node);//按正常入栈1
}
int pop() {
int data;
while(stack2.empty()){
while(!stack1.empty()){//如果栈2是空的,就可以直接入栈了
int datatop = stack1.top();//取栈顶的元素压入栈1
stack1.pop();//栈顶元素出栈1
stack2.push(datatop);//将栈1的栈顶元素压入栈2
}
}
data = stack2.top();//如果栈2是非空的话,需要进行弹出操作
stack2.pop();
return data;
}
private:
stack<int> stack1;
stack<int> stack2;
};
PS:公众号上线啦,技术干货分享,欢迎关注。