了解队列和栈
栈的基本操作:
Stack stackIn=new Stack<>();
判断是否为空 isEmpty();
把元素压栈:push(E);
把栈顶的元素“弹出”:pop();
取栈顶元素但不弹出:peek()。
是否存在: search(O)
队列的基本操作
Deque deque=new ArrayDeque<>();
增加一个元索: add 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
添加一个元素并返回true offer
移除并返回队列头部的元素 remove
返回队列头部的元素 element
移除并返问队列头部的元素 poll
返回队列头部的元素 peek
Deque是接口所能代表的数据结构:队列,双端队列,堆栈。
之前老是把deque和Queue搞混,
这里显示下其结构
ArrayDeque实现了双端队列,可以两端添加、删除元素
用栈实现队列
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空
思路
这里是用两个栈来是实现,一个in,一个out
添加的时候,添加到in里面(后续out里面有值也一样)
然后出来的时候,如果out里面没有 ,in先全部加到out里面,再出来
下面用具体案例来展示
代码
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn=new Stack<>();
stackOut=new Stack<>();
}
/**
* 将元素 x 推到队列的末尾
* @param x
*/
public void push(int x) {
stackIn.push(x);
}
/**
* 从队列的开头移除并返回元素
* @return
*/
public int pop() {
if (stackOut.empty()){
while (!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.pop();
}
/**
* 返回队列开头的元素
* @return
*/
public int peek() {
if (stackOut.empty()){
while (!stackIn.empty()){
stackOut.push(stackIn.pop());
}
}
return stackOut.peek();
}
/**
* 如果队列为空,返回 true ;否则,返回 false
* @return
*/
public boolean empty() {
return stackOut.empty()&&stackIn.empty();
}
用队列实现栈
使用队列实现栈的下列操作:
- push(x) – 元素 x 入栈
- pop() – 移除栈顶元素
- top() – 获取栈顶元素
- empty() – 返回栈是否为空
思路
这里用一个队列来模拟栈
添加一个元素之后,将这个元素的前面的元素挨个移出来,加入到队列后面
这个调整队列次数是 size-1,也就是把 size-1 个元素移到后面去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvsK2nVt-1677221621821)(C:\Users\14133\AppData\Roaming\Typora\typora-user-images\image-20230224142949263.png)]
代码
class MyStack {
Deque<Integer> deque;
public MyStack() {
deque=new ArrayDeque<>();
}
/**
* 将元素 x 压入栈顶。
* @param x
*/
public void push(int x) {
deque.offer(x);
int size=deque.size();
while (size-->1){
deque.offer(deque.pollFirst());
}
}
/**
* 移除并返回栈顶元素。
* @return
*/
public int pop() {
return deque.poll();
}
/**
* 返回栈顶元素。
* @return
*/
public int top() {
return deque.peek();
}
/**
* 如果栈是空的,返回 true ;否则,返回 false 。
* @return
*/
public boolean empty() {
return deque.isEmpty();
}
}