理论基础
文章链接:
基础:
栈
栈的特点:先进后出
具体方法:
队列
队列的特点:先进先出
具体方法:
用栈实现队列
题目链接:
利用两个栈实现队列,一个输入栈一个输出栈
代码:
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn=new Stack<Integer>();//输入栈
stackOut=new Stack<Integer>();//输出栈
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
return stackOut.peek();
}
public boolean empty() {
return stackIn.isEmpty()&&stackOut.isEmpty();//输入输出栈都为空,则队列为空
}
private void dumpstackIn(){
if (!stackOut.isEmpty()) return;
while (!stackIn.isEmpty()){//如果输出栈为空,将输入栈所有的元素压入输出栈
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();
*/
用队列实现栈
题目链接:
利用一个队列完成队列模拟栈
思路:将队列的最后一个元素之前的元素,弹出并重新压入队列即可实现先进后出
代码:
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 result = queue.poll();
queue.add(result);
return result;
}
public boolean empty() {
return queue.isEmpty();
}
public void rePosition(){
int size = queue.size();//将除了最后一个的元素弹出并重新加入队列
size--;
while(size-->0)
queue.add(queue.poll());
}
}
/**
* 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();
*/