232.用栈实现队列
题目链接:232. 用栈实现队列 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili
解题思路:
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.empty()) {
while (!stackin.empty()) {
stackout.push(stackin.pop());
}
}
return stackout.pop();
}
public int peek() {
int res = this.pop();
stackout.push(res);
return res;
}
public boolean empty() {
return stackin.isEmpty() && stackout.isEmpty();
}
}
时间复杂度:push和empty为O(1), pop和peek为O(n)
该题总结:其实我还没学数据结构,写起来有点吃力,主要是不太清楚栈和队列的逻辑,以及他们在java中怎么实现以及函数的使用,写完这道题才算是对栈和队列有了初步的了解。
225. 用队列实现栈
题目链接:225. 用队列实现栈 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili
解题思路:
class MyStack {
Queue<Integer> que;
public MyStack() {
que = new LinkedList<>();
}
public void push(int x) {
que.add(x);
}
public int pop() {
reposition();
return que.poll();
}
public int top() {
reposition();
int result = que.poll();
que.add(result);
return result;
}
public boolean empty() {
return que.isEmpty();
}
public void reposition() {
int size = que.size() - 1;
while (size-- != 0) {
que.add(que.poll());
}
}
}
时间复杂度:pop为O(n),其他为O(1)
该题总结:这道题在top的pop两个函数中我的逻辑并不是很清晰,两个reposition使用地不好,不清楚他们在力扣上究竟是独立实现的还是互相影响的,这个问题影响了我对这道题的作答,其实有更好的办法,就是在push方法中就将每个元素排好序,后面就不需要用这种逻辑不清的reposition函数了。