JAVA二刷-Day10 | 232.用栈实现队列, 225. 用队列实现栈
栈和队列详解
用栈实现队列
LeetCode题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/
解题思路
由于栈是LIFO(后进先出),因此想要吧最里面的拿出来,需要多设计一个栈来进行顺序的颠倒,然后进行pop操作后再复位。注意STL中stack的各种调用方法,无法调用栈底元素,调用栈顶使用.top()。
代码如下:
class MyQueue {
private Stack<Integer> stk1;
private Stack<Integer> stk2;
public MyQueue() {
stk1 = new Stack();
stk2 = new Stack();
}
public void push(int x) {
stk1.push(x);
}
public int pop() {
while (!stk1.empty()) {
stk2.push(stk1.peek());
stk1.pop();
}
int result = stk2.peek();
stk2.pop();
while (!stk2.empty()) {
stk1.push(stk2.peek());
stk2.pop();
}
return result;
}
public int peek() {
while (!stk1.empty()) {
stk2.push(stk1.peek());
stk1.pop();
}
int result = stk2.peek();
while (!stk2.empty()) {
stk1.push(stk2.peek());
stk2.pop();
}
return result;
}
public boolean empty() {
return stk1.empty();
}
}
用队列实现栈
LeetCode题目链接:https://leetcode.cn/problems/repeated-substring-pattern/
解题思路
队列属于FIFO(先进先出)类型,因此想要模仿栈的后进先出,可以通过单个队列的循环进行,直接单个队列循环到最后一个,并将最后一个元素只pop,不再push进入队列即可。队列可以获取头部和尾部的元素,通过.front()和.back()。
特别的,注意队列的压入和弹出,使用的是offer和poll、同时,java中的队列是通过linkedlist的接口实现,所以new创建的是linkedList
具体代码如下:
class MyStack {
Queue<Integer> que;
public MyStack() {
que = new LinkedList<>();
}
public void push(int x) {
que.offer(x);
}
public int pop() {
int len = que.size() - 1;
while (len > 0) {
que.offer(que.peek());
que.poll();
len--;
}
int result = que.peek();
que.poll();
return result;
}
public int top() {
int len = que.size() - 1;
while (len > 0) {
que.offer(que.peek());
que.poll();
len--;
}
int result = que.peek();
que.offer(que.peek());
que.poll();
return result;
}
public boolean empty() {
return que.isEmpty();
}
}