一、理论基础
队列:先入先出 入:123 出:123
栈:先入后出 入:123 出:321
栈的内部结构:栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现
二、232.用栈实现队列
题目:使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
方法:用两个栈来实现队列,将队列的元素同样放入栈1中,栈1弹出元素放入栈2,再用栈2正常弹出元素,即与队列输出元素顺序相同。
关于java中的栈:Java 栈 stack方法总结_renxingzhadan的博客-CSDN博客_stack方法
Stack的方法
1. java中Stack只有一个无参构造函数。
2. 属于stack自己的方法包括
- push( num) //入栈
- pop() //栈顶元素出栈
- empty() //判定栈是否为空
- peek() //获取栈顶元素
- search(num) //判端元素num是否在栈中,如果在返回1,不在返回-1。
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
/** Initialize your data structure here. */
//初始化两个栈
public MyQueue() {
stackIn = new Stack<>(); // 负责进栈
stackOut = new Stack<>(); // 负责出栈
}
/** Push element x to the back of queue. */
//push(x) -- 将一个元素放入队列的尾部。
public void push(int x) {
stackIn.push(x);
}
/** Removes the element from in front of queue and returns that element. */
//pop() -- 从队列首部移除元素。
public int pop() {
dumpstackIn();
return stackOut.pop();
}
/** Get the front element. */
//peek() -- 返回队列首部的元素。
public int peek() {
dumpstackIn();
return stackOut.peek();
}
/** Returns whether the queue is empty. */
//empty() -- 返回队列是否为空。
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
// 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
//如果stackOut不为空,返回
if (!stackOut.isEmpty()) return;
//需要将所有stackIn中的元素放到stackOut(关键:一定要放完)
while (!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
三、225. 用队列实现栈
题目:使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈
- pop() -- 移除栈顶元素
- top() -- 获取栈顶元素
- empty() -- 返回栈是否为空
基础理论:JAVA队列( Queue ) 详解_java叶新东老师的博客-CSDN博客_java 队列
队列常用方法:
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
drainTo(list) 一次性取出队列所有元素
方法一:两个队列来实现栈的思路。
队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。
(重点)方法二:一个队列来实现栈的思路。
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。
代码,主要分了两类:Queue是FIFO的单向队列,Deque是双向队列。有4种写法:代码随想录
区别:Java--Queue和Deque_流心奶黄包.的博客-CSDN博客
第四种:使用一个 Queue 实现:
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
//每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
public void push(int x) {
queue.offer(x);
int size = queue.size();
//移动除了 A 的其它数
while (size-- > 1)
queue.offer(queue.poll());
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}