代码随想录算法训练营day10 | 232.用栈实现队列, 225. 用队列实现栈
栈与队列基础
stack
Queue(单向队列)
LinkedList 实现了 Queue 接口,可作为队列使用。
Deque(双端队列接口,既可以当作队列用也可以当作栈用)
LinkedList 实现了 Deque 接口,可作为双端队列使用。
1.普通队列:
Deque接口扩展(继承)了 Queue 接口。
2.双端队列:
3.栈:
232.用栈实现队列
教程视频:https://www.bilibili.com/video/BV1nY4y1w7VC
解法
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
if(stackOut.isEmpty()){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.pop();
}
public int peek() {
//一个空的队列不会调用 pop 或者 peek 操作
//如果out栈有元素,先弹出返回再压入
if(stackOut.isEmpty()){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
int temp = stackOut.pop();
stackOut.push(temp);
return temp;
}
public boolean empty() {
return (stackIn.isEmpty() && stackOut.isEmpty());
}
}
225. 用队列实现栈
教程视频:https://www.bilibili.com/video/BV1Fd4y1K7sm
解法一:用一个单向队列实现
每次压入新元素都调整到即将出队的位置,使其中元素保持为堆栈顺序
class MyStack {
Queue<Integer> q1;
public MyStack() {
q1 = new LinkedList<Integer>();
}
public void push(int x) {
q1.offer(x);
int size = q1.size();
size--;
while(size!=0){
q1.offer(q1.poll());
size--;
}
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
解法二:用一个双向队列实现
从头部插入从头部弹出
class MyStack {
Queue<Integer> q1;
public MyStack() {
q1 = new LinkedList<Integer>();
}
public void push(int x) {
q1.offer(x);
int size = q1.size();
size--;
while(size!=0){
q1.offer(q1.poll());
size--;
}
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
总结
Stack基础操作
操作 | 方法 |
---|---|
压入元素 | push(x) |
弹出元素 | pop() |
查看顶部元素 | peek() |
判断是否为空 | empty() / isEmpty() |
Queue基础操作
操作 | 方法 |
---|---|
压入元素 | offer(x) |
弹出元素 | poll() |
查看顶部元素 | peek() |
判断是否为空 | isEmpty() |
Deque基础操作
操作 | 方法 | 操作 | 方法 |
---|---|---|---|
头部压入元素 | offerFirst(x) | 尾部压入元素 | offerLast(x) |
头部弹出元素 | pollFirst() | 尾部弹出元素 | pollLast() |
查看 头部元素 | peekFirst() | 查看尾部元素 | peekLast() |
判断是否为空 | isEmpty() |