day_10
传送门
-
225 - 用队列实现栈 - 题目链接/文章讲解/视频讲解
-
232 - 用栈实现队列 - 题目链接/文章讲解/视频讲解
225 - 用队列实现栈
- 思路,将队尾前面的所以元素移动到队尾的后面,就可以实现 pop 操作了
- C语言未用队列实现代码,单纯实现了一个栈,提交通过
// 用一个队列实现一个栈
#include<stdbool.h>
#define SIZE 105
typedef struct {
int MyStack[SIZE]; // 其实这玩意是队列
int size; // 当前的元素 size
} MyStack;
MyStack* myStackCreate() {
MyStack* stack = (MyStack* )malloc(sizeof(MyStack)); // 申请一片空间过来
stack -> size = 0;
return stack;
}
void myStackPush(MyStack* obj, int x) {
obj -> MyStack[obj->size++] = x;
}
int myStackPop(MyStack* obj) {
int index = obj -> size;
int topElement = obj -> MyStack[index - 1];
obj -> size--;
return topElement;
}
int myStackTop(MyStack* obj) {
int index = obj -> size;
return obj -> MyStack[index - 1];
}
bool myStackEmpty(MyStack* obj) {
return obj -> size == 0;
}
void myStackFree(MyStack* obj) {
free(obj);
}
/**
* C 实现的思路:
* 1. 用一个 queue 实现
* 2. 写两个额外的函数
* - reverse (数组颠倒)
* - updateArray (更新数组)
* - 思路解释
* - a. 反转整个有效数组
* - b. 开始更新,双指针更新,快指针赋给慢指针,直到 fast < size 结束
* - c. 修改栈内的 size 到此OK
*/
- 其实双端队列更好实现,pop掉尾巴, push进头部
232 - 用栈实现队列
- 注意点:
- peek 的时候,可能out为空,但整个队列不为空,这时应该将in的元素丢到out里
- 双端队列里使用 pop,push的时候,推荐使用 linkedList,因为会插入到第一个
- 代码实现
class MyQueue {
Deque<Integer> deque_in;
Deque<Integer> deque_out;
public MyQueue() {
deque_in = new LinkedList<>();
deque_out = new LinkedList<>();
}
public void push(int x) {
deque_in.push(x);
}
public int pop() {
inStackData2OutStack();
return deque_out.pop();
}
public int peek() {
inStackData2OutStack();
return deque_out.peek();
}
public boolean empty() {
return deque_in.isEmpty() && deque_out.isEmpty();
}
// 如果 out 栈为空,先移动in 栈内元素到out里
private void inStackData2OutStack(){
if (!deque_out.isEmpty()) return;
while (!deque_in.isEmpty()){
deque_out.push(deque_in.pop());
}
}
}