232.用栈实现队列代码随想录
pop和peek的大体思路是把stackIn倒入stackOut,再从stackOut里pop元素,但是当stackOut里元素没pop完,stackIn里又加入了新元素,要加一个stackOut为空才能再倒入元素的判断语句,不然pop的顺序就出错了(会把新push的元素先于stackOut的既有元素pop出来)
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()){
return stackOut.pop();
}else{
dumpstackIn();
return stackOut.pop();
}
}
public int peek() {
if(!stackOut.empty()){
return stackOut.peek();
}else{
dumpstackIn();
return stackOut.peek();
}
}
public boolean empty() {
if(stackIn.empty() && stackOut.empty()){
return true;
}else{
return false;
}
}
public void dumpstackIn(){
while(!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
}
/**
* 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();
*/
225. 用队列实现栈代码随想录
对队列的初始化还不太会,只知道用Queue和LinkedList,什么Deque和ArrayList不太会用
queue内部有isEmpty也不知道
对于一个循环变量来说,判断其的两个状态:承前状态,刚刚更新完变量没有进入下一次循环的判断,启后状态,进入下一次循环的判断并执行操作。一般来说启后状态属于当前循环状态,启后之后的自更新是为下一次循环服务的。例如对1~n每一个都操作,最后有n的节点状态满足循环,i自减到0退出循环;再例如x~n操作,有n-x+1的节点状态满足循环变量自减,最后i变成x-1节点退出循环。
k
这种数数是代码基本功。
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
}
public int pop() {
rePosition();
return queue.poll();
}
public int top() {
rePosition();
int res = queue.poll();
queue.add(res);
return res;
}
public boolean empty() {
return queue.isEmpty();
}
public void rePosition(){
int size = queue.size();
size--;
while(size != 0){
queue.add(queue.poll());
size--;
}
}
}
/**
* 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();
*/