● 理论基础
题目链接:● 232.用栈实现队列
文章讲解:代码随想录
第一想法:
因为栈并不是我们像数组一样是一个很底层的结构,我感觉栈就像合成怪一样,它本身并不想数组,这么独立性,更像是利用更加底层结构的这样那样的方法,然后合成一个具有很多很实用的方法的一个类,然后我们就使用这个类的方法做这样那样的工作,我们给这个类起一个名字,我们称之为栈,同理,队列也是一样的道理;
所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
如何解决问题:
我们只要使用一些结构去合成队列所具备的方法就可以;
因此我们可以使用两个栈去合成队列;
我们因此只需要使用两个栈去完美实现队列的方法就可以了;、
class MyQueue {
Stack<Integer> stackIn = new Stack<>();
Stack<Integer> stackOut = new Stack<>();
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.peek());
stackIn.pop();
}
}
int res = stackOut.peek();
stackOut.pop();
return res;
}
public int peek() {
int res = this.pop();
stackOut.push(res);
return res;
}
public boolean empty() {
return stackIn.empty() && stackOut.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();
*/
题目:● 225. 用队列实现栈
题目链接/文章讲解/视频讲解:代码随想录
第一想法:使用两个队列实现栈的功能;
看完代码随想录之后的想法:使用一个队列实现栈的功能;
这个题比较简单
代码:
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int n = queue.size();
while(n-- > 1) {
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.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();
*/