PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。
1. 用队列实现栈
题目描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int peek() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false
示例
请设计出可以满足上述要求的代码
解析
做这道题可能比较绕,为了满足栈后入先出,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素,我们可以使用两个队列q1,q2实现栈的操作。
当实现入栈时,将元素放入有元素的队列中,如果两个队列都为空,我们可以放入任意一个,这里我们把它放入q1中。
当实现出队列时,我们可以把有元素的队列元素依次放入到另一个队列中,当这个队列就剩一个元素,就不要在放了,这个元素就是要出的元素。
重复以上操作,便用队列实现了栈。
2. 用栈实现队列
题目描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
示例
请设计出可以满足上述要求的代码
解析
如果第一次看到这题,你可能会有点蒙,但这很正常,这个题其实也不难。为了满足队列的先入先出,我们可以使用两个栈,一个放一个出,s1,s2。
当放元素的时候,可以放入任意栈,我们这里放入s1,s2实现出。
当出元素的时候,如果s2中没有元素,我们将s1中的元素全部放入s2,这样元素便倒置,再次出栈的时候就刚好对应上了先入先出,如果s2中有元素,我们便出s2的元素。
重复以上操作。
3. 答案
3.1 用队列实现栈
class MyStack { public Queue<Integer> q1; public Queue<Integer> q2; public MyStack() { q1 = new LinkedList<>(); q2 = new LinkedList<>(); } //放 public void push(int x) { if(!q1.isEmpty()){ q1.offer(x); }else if(!q2.isEmpty()){ q2.offer(x); }else{ q1.offer(x); } } //出 public int pop() { if(empty()){ return -1; } if(!q1.isEmpty()){ int len = q1.size(); for(int i = 0; i < len - 1; i++){ int x = q1.poll(); q2.offer(x); } return q1.poll(); } if(!q2.isEmpty()){ int len = q2.size(); for(int i = 0; i < len - 1; i++){ int x = q2.poll(); q1.offer(x); } return q2.poll(); } return -1; } public int top() { if(empty()){ return -1; } if(!q1.isEmpty()){ int x = 0; int len = q1.size(); for(int i = 0; i < len; i++){ x = q1.poll(); q2.offer(x); } return x; } if(!q2.isEmpty()){ int x = 0; int len = q2.size(); for(int i = 0; i < len; i++){ x = q2.poll(); q1.offer(x); } return x; } return -1; } public boolean empty() { return (q1.size() == 0 && q2.size() == 0); } }
3.2 用栈实现队列
class MyQueue { public Stack<Integer> s1; public Stack<Integer> s2; public MyQueue() { s1 = new Stack<>(); s2 = new Stack<>(); } public void push(int x) { s1.push(x); } public int pop() { if(empty()){ return -1; } if(s2.isEmpty()){ while(!s1.isEmpty()){ int x = s1.pop(); s2.push(x); } } return s2.pop(); } public int peek() { if(empty()){ return -1; } if(s2.isEmpty()){ while(!s1.isEmpty()){ int x = s1.pop(); s2.push(x); } } return s2.peek(); } public boolean empty() { return s1.isEmpty() && s2.isEmpty(); } }