夸克作文网站,淄博团购网站建设,做建筑材料的网站,织梦移动端网站模板下载题目传送门#xff1a;Leetcode255.用队列实现栈 请你仅使用两个队列实现一个后入先出#xff08;LIFO#xff09;的栈#xff0c;并支持普通栈的全部四种操作#xff08;push、top、pop 和 empty#xff09;。 实现 MyStack 类#xff1a; void push(int x) 将元素 x 压… 题目传送门Leetcode255.用队列实现栈 请你仅使用两个队列实现一个后入先出LIFO的栈并支持普通栈的全部四种操作push、top、pop 和 empty。 实现 MyStack 类 void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的返回 true 否则返回 false 。 注意 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你所使用的语言也许不支持队列。 你可以使用 list 列表或者 deque双端队列来模拟一个队列 , 只要是标准的队列操作即可。 示例 输入
[MyStack, push, push, top, pop, empty]
[[], [1], [2], [], [], []]
输出
[null, null, null, 2, 2, false]解释
MyStack myStack new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False提示 1 x 9最多调用100 次 push、pop、top 和 empty每次调用 pop 和 top 都保证栈不为空 进阶你能否仅用一个队列来实现栈。 试题解析
已知队列是先进先出栈是先进后出。 当我们寻找栈顶元素时实际上是要将当前队列的尾元素输出但队列的pop()函数只能弹出队首这时便可以使用第二个辅助队列。具体方案
定义两个队列q1,q2q1为存放数据的队列q2是辅助队列每一步操作之后都要将数据存回q1
进行push操作时在q1中插入元素 进行pop操作时
1、将q1中的除了队尾之外的元素全部插入到q2队列中
2、在q1中删除剩下的元素即队尾元素
3、将q2队列中的元素再插回到q1中
class MyStack {
public:queueint q1;queueint q2;MyStack() {}void push(int x) {q1.push(x);}int pop() {int n 0;while(n q1.size() - 1){//循环到q1只剩一个元素q2.push(q1.front());q1.pop();}int num q1.front();q1.pop();//将数据存回q1while(!q2.empty()){q1.push(q2.front());q2.pop();}return num;}int top() {return q1.back();}bool empty() {if(q1.empty()){return true;}return false;}
}; 更好方案
从以上方法我们可以观察到q1是存放数据的队列q2为辅助队列每一次执行删除之后都要将q2的数据存回q1接下来的push,pop操作都是从q1开始
那么我们可不可以在每一次pop中都少一次存回q1的操作而将之后的push,pop操作开始于q2呢
已知我们每一次转移元素操作后都会有一个队列为空那么pop操作时我们只需要从不为空的队列开始操作即可
至于push操作在最开始时q1,q2都为空时我们将元素添加到q1对于之后的操作我们还是只需要从不为空的队列开始插入元素即可。
class MyStack {
public:queueint q1;queueint q2;MyStack() {}void push(int x) {//若q1,q2都不为空则插入到q1后if(q1.empty()q2.empty()){q1.push(x);}else{//选择不空的队列插入元素if(!q1.empty()) q1.push(x);else if(!q2.empty()) q2.push(x);}}int pop() {int n 0;int num;//选择不空的队列操作if(!q1.empty()){while(n q1.size() - 1){q2.push(q1.front());q1.pop();}num q1.front();q1.pop();}else if(!q2.empty()){while(n q2.size() - 1){q1.push(q2.front());q2.pop();}num q2.front();q2.pop();}return num;}int top() {//选择不空的队列操作if(q1.empty()){while(!q2.empty()){q1.push(q2.front());q2.pop();}return q1.back();}else if(q2.empty()){while(!q1.empty()){q2.push(q1.front());q1.pop();}return q2.back();}return 0;}bool empty() {if(q1.empty()q2.empty()){return true;}return false;}
};