用两个栈实现队列
程序员文章站
2022-03-14 15:31:56
...
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
自己的思路
思路应该都能想得到,就是想将所有的数压入一个栈,再全部出栈并压入另一个栈,再出栈,次时就是先进先出的顺序了。但是实现起来貌似并不容易,需要判断是不是栈中最后一个元素,以及什么时候开始压入另一个栈,可能还是自己对栈这个数据结构不够熟悉吧,感觉自己写对了,但是提交后就是错误的,还是先上代码吧
class Solution
{
public:
int num=0;
void push(int node) {
stack1.push(node);
++num;
}
int pop() {
while(stack1.size()>0){
int temp = stack1.top();
stack1.pop();
stack2.push(temp);
}
int temp2 = stack2.top();
stack2.pop();
}
private:
stack<int> stack1;
stack<int> stack2;
};
大佬的思路
其实自己的代码通过修改就可以a的,但是可能心态浮躁,改不下去了,止步正确答案。思路其实没问题的,就是里面的判断条件及返回值没有思考清楚,题目的意思是可以通过这个类对象,每次调用push函数,就压入一个元素,调用pop函数就出一个元素,故pop里面肯定是要return一个元素的。关键点就是pop函数中,进入的时候要先判断stack2是否为空,也就是第一次调用的时候会为将stack1的所有元素出栈,并压入stack2,然后弹出stack2栈顶元素,后面每次调用pop函数就仅仅是弹出栈顶元素了。(其实还有一种方法是通过栈的下标,因为栈是有下标的,且[0]位于栈底,这里就不去总结了)
根据大佬的代码,在自己的代码上进行修改一下(其实就是几乎完全一样了)
上代码
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty()){ //只有第一次调用pop会进入这个条件
while(!stack1.empty()){
int temp = stack1.top();
stack2.push(temp); //这里的push和top是栈里面的函数,不是这个类的成员函数
stack1.pop();
}
}
int temp2=stack2.top(); //这样就保证了每次就弹出一个元素
stack2.pop();
return temp2;
}
private:
stack<int> stack1;
stack<int> stack2;
};