目录
最近博主在实习中,所以更新的频率可能会比较慢,大家有不懂的可以直接私信我.
1. 栈实现队列
1.1题目描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
说明:
- 你 只能 使用标准的栈操作 —— 也就是只有
push to top
,peek/pop from top
,size
, 和is empty
操作是合法的
1.2思路解析
这道题,给我们的局限就在于,使用两个栈实现一个队列.那么我们首先要想到的是,栈是先进后出的,而队列是先进先出的.所以我们得用这两个栈,来完成队列这种先进先出的操作.
我们可以用以下思路来解决本题
1. 我们将栈1 ,作为我们的主要的栈,栈2作为我们的辅助栈, 在入栈的时候,先把栈1的元素都压入到栈2中去
2. 然后在把元素4压入栈1中.
3.最后把栈2中的元素压回栈1中
这样我们在压栈的时候,就可以保证先进后出这种队列的特性了.
至于出队列,就更容易了,只需要把栈顶元素返回即可.
1.3代码编写
class MyQueue {
//定义两个栈
Stack<Integer> stack1 ;
Stack<Integer> stack2 ;
public MyQueue() {
//在构造方法中初始化这两个栈
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
//首先把栈1的元素压入栈2
while(!stack1.isEmpty()){
stack2.add(stack1.pop());
}
//把元素压入到栈1中
stack1.add(x);
//把栈二的元素压入进去
while(!stack2.isEmpty()){
stack1.add(stack2.pop());
}
}
public int pop() {
if(!stack1.isEmpty()){
return stack1.pop();
}
return -1;
}
public int peek() {
if(!stack1.isEmpty()){
return stack1.peek();
}
return -1;
}
public boolean empty() {
if(stack1.isEmpty()){
return true;
}
return false;
}
}
2.用队列实现栈
2.1题目描述
请你仅使用两个队列实现一个后入先出(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
这些操作。
2.2思路解析
本题是用两个队列实现一个栈,我们可以先直接入到队列2中,然后把队列1中的元素,都入到队列2中,
这样,队列2中的元素就可以满足先进先出的原则了.
后面本题的点睛之笔来了,我们直接让队列1等于队列2,队列2等于队列1
在入的时候重复此操作即可.
1.先入到队列2中
2.在把队列1中的元素,插入到队列2中
3.最后把队列1设为队列2 队列2 设为队列1 即可
2.3代码编写
class MyStack {
//定义两个队列
Queue<Integer> queue1 ;
Queue<Integer> queue2;
public MyStack() {
// 初始化这两个栈
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
//先压入到队列2中
queue2.add(x);
//在把队列1中的元素全部加入到队列2中
while(!queue1.isEmpty()){
queue2.add(queue1.poll());
}
//交换队列1 队列2
Queue<Integer> tmp = queue1;
queue1 = queue2;
queue2 = tmp;
}
public int pop() {
if(!queue1.isEmpty()){
return queue1.poll();
}
return -1;
}
public int top() {
if(!queue1.isEmpty()){
return queue1.peek();
}
return -1;
}
public boolean empty() {
if(queue1.isEmpty()){
return true;
}
return false;
}
}
以上就是今天的两个栈实现队列,两个队列实现栈的题,希望各位同学们看完能获得新的收获,感谢大家观看!