栈与队列理论基础
原理:栈先进后出,队列先进先出。
栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供根据索引访问,也不提供迭代器,不像set或map对象提供迭代器来遍历所有元素。
栈是以底层容器完成其所有的工作,对外提供统一的接口,低层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器。
LeetCode 232.用栈实现队列
第一次做这种类型的题目,也不是很明白题目的意思,看了题解后对着敲了一遍。代码如下:
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() {
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();
*/
LeetCode 225. 用队列实现栈
本题尝试用两个队列,其中辅助队列是用来保存队列当下的元素,再将x加入到队列中,最后再将辅助队列中的元素加入到队列中,便可实现后进先出。本题也主要是熟悉Java中队列的相关操作,队列可以通过size函数获得当前的长度,代码如下:
class MyStack {
Queue<Integer> queueIn;
Queue<Integer> queueOut; // 辅助队列,用来保存队列当前的元素
public MyStack() {
queueIn = new ArrayDeque<>();
queueOut = new ArrayDeque<>();
}
public void push(int x) {
while(queueIn.size() > 0){
queueOut.offer(queueIn.poll());
}
queueIn.offer(x);
while(queueOut.size() > 0){
queueIn.offer(queueOut.poll());
}
}
public int pop() {
return queueIn.poll();
}
public int top() {
return queueIn.peek();
}
public boolean empty() {
return queueIn.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();
*/