Leetcode 232:
https://leetcode.com/problems/implement-queue-using-stacks/
题目的第一想法:
这道题目我的第一想法是使用两个Stack,做一个反反得正。就是说当我有一个顺序是反着的数据结构s1,只要把s1里面的所有数据一次装到s2里面,就可以得到一个正序的结构了。但我这个写的有些不好的是没有考虑到s1和s2的关系。在我最一开始的认知中可以做一个数据结构空和满的判断来决定数据要从哪个stack转移。但后来我发觉这样写起来比较麻烦,于是我决定统一把数据留在一个里面。然后每次倒另一个后再倒回来
看完代码随想录之后的想法:
看完的之后理解了往回到这个操作是多余了。因为第二个在输出时已经是正常的queue的order了。所以倒的那一步是多余的,只要做一个判断看第二个数据结构是否为空就好。如果是空就把第一个数据结构里的东西加进去。写法如下
class MyQueue {
Stack<Integer> s1;
Stack<Integer> s2;
public MyQueue() {
s1 = new Stack<>();
s2 = new Stack<>();
}
public void push(int x) {
s1.add(x);
}
public int pop() {
int r = 0;
while(!s1.empty()){
s2.add(s1.pop());
}
r = s2.pop();
while(!s2.empty()){
s1.add(s2.pop());
}
return r;
}
public int peek() {
int r = 0;
while(!s1.empty()){
s2.add(s1.pop());
}
r = s2.peek();
while(!s2.empty()){
s1.add(s2.pop());
}
return r;
}
public boolean empty() {
return s1.empty();
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
Leetcode 225:
https://leetcode.com/problems/implement-queue-using-stacks/
题目的第一想法:
这道题我被两个queue和上一道所谓反反得正的思维给禁锢住了。所以没能想到特别好的写法。知道我看到那句其实用一个也能写,才发觉这题跟order没有关系。只要计数正确就好。就是说只要确保在输出时我们会输出最后一个数字即可。那么做法就是吧一个东西poll出去再add回来。写法如下
/*
3 1 2
*/
class MyStack {
Queue<Integer> q = new LinkedList<>();
public void push(int x) {
q.add(x);
}
public int pop() {
int num = q.size();
for(int i = 0; i < num - 1; i++){
q.add(q.poll());
}
return q.poll();
}
public int top() {
int num = pop();
q.add(num);
return num;
}
public boolean empty() {
return q.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/