bash
第五章 栈与队列part01
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4
今日任务:
● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈
理论基础
了解一下 栈与队列的内部实现机智,文中是以C++为例讲解的。
文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
232.用栈实现队列
大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0232.%E7%94%A8%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.html
225. 用队列实现栈
可以大家惯性思维,以为还要两个队列来模拟栈,其实只用一个队列就可以模拟栈了。
建议大家掌握一个队列的方法,更简单一些,可以先看视频讲解
题目链接/文章讲解/视频讲解:https://programmercarl.com/0225.%E7%94%A8%E9%98%9F%E5%88%97%E5%AE%9E%E7%8E%B0%E6%A0%88.html
目录
理论基础
栈(Stack)和队列(Queue)是两种常见的数据结构,它们在 Java 中都有对应的类和接口,并且都有一些常用的函数或方法。以下是它们的常用函数或方法:
1、栈(Stack)
在 Java 中,栈的常用函数和方法包括:
push(E item)
: 将元素压入栈顶。pop()
: 弹出栈顶元素并返回。peek()
: 返回栈顶元素但不移除。empty()
: 判断栈是否为空。search(Object o)
: 查找指定元素在栈中的位置,从栈顶开始计数,返回距离栈顶最近的位置。Java 中的栈类是
java.util.Stack
,它是Vector
类的一个子类,使用它可以实现栈的基本功能。
2、队列(Queue)
在 Java 中,队列的常用函数和方法包括:
add(E e)
或offer(E e)
: 向队尾添加一个元素。remove()
或poll()
: 移除并返回队列头部的元素。element()
或peek()
: 返回队列头部的元素但不移除。isEmpty()
: 判断队列是否为空。size()
: 返回队列中的元素个数。clear()
: 清空队列。Java 中的队列接口有多个实现类,最常见的是
java.util.LinkedList
(链表实现的队列)和java.util.ArrayDeque
(数组实现的队列),它们都实现了Queue
接口。需要注意的是,
Stack
类和Vector
类以及它们的方法在 Java 中被认为是不推荐使用的,因为它们的同步操作可能导致性能下降。推荐使用ArrayDeque
或LinkedList
作为栈和队列的实现。
0232_用栈实现队列
java
import java.util.Stack;
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.
*/
public void push(int x) {
stackIn.push(x);
}
/**
* Removes the element from in front of queue and returns that element.
*/
public int pop() {
dumpstackIn();
return stackOut.pop();
}
/**
* Get the front element.
*/
public int peek() {
dumpstackIn();
return stackOut.peek();
}
/**
* Returns whether the queue is empty.
*/
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
//如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn() {
if (!stackOut.isEmpty()) return;
while (!stackIn.isEmpty()) {
stackOut.push(stackIn.pop());
}
}
}
0225_用队列实现栈
java
import java.util.LinkedList;
import java.util.Queue;
/**
* 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();
*/
class MyStack225 {
Queue<Integer> q;
public void MyStack225() {
q = new LinkedList<>();
}
//将元素x压入栈顶。
public void push(int x) {
q.offer(x);
int size = q.size();
//q.add(x);
while (size > 0) {
q.offer(q.poll());
size--;
}
}
//移除并返回栈顶元素。
public int pop() {
return q.poll();
}
//返回栈顶元素。
public int top() {
return q.peek();
}
//如果栈是空的,返回true;否则,返回false。
public boolean empty() {
return q.isEmpty();
}
}