栈与队列基础知识:
232.用栈实现队列
初始思路&&题解复盘
这里首先是考虑到肯定需要另一条栈用来改变存入数据的栈的输入和输出的顺序,但是忽略了一些小细节。
1)必须首先判断栈2是否为空,再将栈1元素存入栈2,不然输入输出的顺序就会被改变。
2)虽然pop和peak思路相近,可以复用pop的代码,但是因为是peak我只需要知道队头的数据是什么,但是不需要让他出来,所以调用pop后还需要将元素push回去。
3)判断为空时需要判断栈1和栈2是否均为空,只有均为空才可以return true;
class MyQueue {
Stack<Integer> stack;//栈
Stack<Integer> stack1;//反着的栈。
public MyQueue() {
stack = new Stack<>();//用来存放栈的顺序
stack1 = new Stack<>();
}
public void push(int x) {
stack.push(x);
}
public int pop() {
//在栈中出去的应该是最后一个进入的元素
//在队列中理应返回的是第一个进入的元素,应该如何实现。
if(stack1.empty()){
while(!stack.empty()){
int n = stack.pop();
stack1.push(n);
}}
return stack1.pop();
}
public int peek() {
int result = this.pop();
stack1.push(result);
return result;
}
public boolean empty() {
if(stack.empty()&&stack1.empty()){return true;}
else{return false;}
}
}
225. 用队列实现栈
初始思路:
首先了解到Queue 是个接口,在实例化时必须实例化 LinkedList 的对象,因为 LinkedList 实现了 Queue 接口。而linkedlist是有index的那我不是想删谁删谁,想输出谁输出谁!
class MyStack {
Queue<Integer> q;
public MyStack() {
q=new LinkedList<>();
}
public void push(int x) {
q.offer(x);
}
public int pop() {
int result =((LinkedList<Integer>) q).get(q.size()-1);
q.remove(((LinkedList<Integer>) q).get(q.size()-1));
return result;
}
public int top() {
int result =((LinkedList<Integer>) q).get(q.size()-1);
return result;
}
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();
*/
但是没有AC,开始寻找问题出现在哪里,存入的顺序是1,2,3,4,2,但是按照我的逻辑pop就会2,2,4,3,1。很显然转为Linkedlist不能解决我的问题。
题解复盘:
栈pop的应该是最后存入的,但是在队列中最后存入的会最后出,所以在pop中先弹出最后一个前面的那些,然后在存入,这样我再弹出的就是我想要的。
class MyStack {
Queue<Integer> q;
public MyStack() {
q=new LinkedList<>();
}
public void push(int x) {
q.offer(x);
}
public int pop() {
int n = q.size()-1;
while(n>0){
q.offer(q.poll());
n--;
}
return q.poll();
}
public int top() {
int result = this.pop();
q.offer(result);
return result;
}
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();
*/