队列
刷道leetcode题目
这一题用两个栈,一个instack,一个outstack即可实现,具体逻辑可以看提交的代码
提交的代码
class MyQueue {
Stack<Integer> instack;
Stack<Integer> outstack;
public MyQueue() {
instack = new Stack<Integer>();
outstack = new Stack<Integer>();
}
public void push(int x) {
instack.push(x);
}
public int pop() {
if(outstack.isEmpty()){
while(!instack.isEmpty()){
outstack.push(instack.pop());
}
return outstack.pop();
}
else{
return outstack.pop();
}
}
public int peek() {
if(outstack.isEmpty()){
while(!instack.isEmpty()){
outstack.push(instack.pop());
}
return outstack.peek();
}
else{
return outstack.peek();
}
}
public boolean empty() {
if(instack.isEmpty() && outstack.isEmpty())
return true;
else
return false;
}
}
双端队列
循环队列
循环队列添加元素的位置公式:
(当前队头位置+队列元素数)%队列总容度
例如:当前队头位置为0,想要添加一个元素,则该元素应该添加在 (0+5)%7 = 5 的位置上。
当然,别忘了检查求出的位置是否与队头相同,若相同,则队列已满。
循环队列的核心就在 取模 上
循环队列的动态扩容如下图所示,元素位置更换后记得把队头位置改为0
循环双端队列
说白了就是在循环队列的基础上,使队列的两端都能出队入队。
刷道leetcode题
提交的代码
class MyStack {
Queue<Integer> q1;
Queue<Integer> q2;
public MyStack() {
q1 = new LinkedList<Integer>();
q2 = new LinkedList<Integer>();
}
public void push(int x) {
if(q1.isEmpty()){
q1.offer(x);
while(!q2.isEmpty()){
q1.offer(q2.poll());
}
}
else{
q2.offer(x);
while(!q1.isEmpty()){
q2.offer(q1.poll());
}
}
}
public int pop() {
if(q1.isEmpty()){
return q2.poll();
}
else{
return q1.poll();
}
}
public int top() {
if(q1.isEmpty()){
return q2.peek();
}
else{
return q1.peek();
}
}
public boolean empty() {
if(q1.isEmpty() && q2.isEmpty())
return true;
else
return false;
}
}
这里值得注意的是java官方的Queue是在LinkedList中实现的,new一个Queue的正确方式如下:
同时,应该牢记Java中栈的常用方法为push、pop、peek、isEmpty,队列的常用方法为offer、poll、peek、isEmpty,别跟c++搞混了(总是会把peek记成top)
今天学得有点少,但是没办法,白天基本都在搞软件工程的大作业文档,二叉树就明天再开始吧。