Stack stack = new Stack();
stack.push(val);
stackList.add(stack);
return;
}
//栈未达到最大值就从容器中最后一个栈的末尾入栈
stackList.get(stackList.size() - 1).push(val);
}
public int pop() {
//直接调用已定义好的方法,下标参数为容器中最后一个栈的下标
return popAt(stackList.size() - 1);
}
public int popAt(int index) {
//下标越界
if (index < 0 || index >= stackList.size()) {
return -1;
}
//得到容器中下标对应的栈
Stack stack = stackList.get(index);
//栈为空
if (stack.isEmpty()) {
return -1;
}
//出栈
int res = stack.pop();
//栈为空时要把这个空栈删除
if (stack.isEmpty()) {
stackList.remove(index);
}
//将出栈的元素返回
return res;
}
}
/**
-
Your StackOfPlates object will be instantiated and called as such:
-
StackOfPlates obj = new StackOfPlates(cap);
-
obj.push(val);
-
int param_2 = obj.pop();
-
int param_3 = obj.popAt(index);
*/
Q3.4 化栈为队
实现一个MyQueue类,该类用两个栈来实现一个队列。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
我们知道:同一段序列,分别存进一个栈和一个队列,那么出栈序列T和出队序列S顺序刚好是相反的。
那么,假如我们有两个栈的话,一段序列list
通过第一个栈后,再压入第二个栈,这时第二个栈的出栈序列应该和list
直接压入队列后的出队序列是一样的。
既然如此,我们用两个栈就可以模拟队列,一个栈专门用来存入数据,记为StackWrite
;一个栈专门用来读取数据,记为StackRead
。基于上面的结论,我们每次入队时,就把数据压入StackWrite
,每次读数据时,就把StackWrite
中的数据再压入StackRead
,这时StackRead
中的栈顶元素
就是我们所期望的队首元素
。
在出队的时候,要注意一点:
-
如果
StackRead
中有数据,那么就直接弹出StackRead
的栈顶元素; -
如果
StackRead
为空,先考虑把StackWrite
中的元素压入StackRead
,再弹出StackRead
的栈顶元素。
class MyQueue {
Stack stackWrite; // 存数据
Stack stackRead; // 读数据
/** Initialize your data structure here. */
public MyQueue() {
stackWrite = new Stack<>();
stackRead = new Stack<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
stackWrite.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
peek();
return stackRead.pop();
}
/** Get the front element. */
public int peek() {
if (!stackRead.isEmpty()) {
return stackRead.peek();
}
while (!stackWrite.isEmpty()) {
stackRead.push(stackWrite.pop());
}
return stackRead.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stackRead.isEmpty() && stackWrite.isEmpty();
}
}
/**
-
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();
*/
Q3.5 栈排序
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。
示例1:
输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
示例2:
输入:
[“SortedStack”, “pop”, “pop”, “push”, “pop”, “isEmpty”]
[[], [], [], [1], [], []]
输出:
[null,null,null,null,null,true]
class SortedStack {
Stack p=new Stack<>();
Stack q=new Stack<>();
public SortedStack() {
}
public void push(int val) {
if(p.empty()) p.push(val);
else{
while(!p.empty()&&p.lastElement()<=val){
q.push(p.lastElement());
p.pop();
}
p.push(val);
while(!q.empty()){
p.push(q.lastElement());
q.pop();
}
}
}
public void pop() {
if(!p.empty()) p.pop();
}
public int peek() {
return p.empty()?-1:p.lastElement();
}
public boolean isEmpty() {
return p.empty();
}
}
Q3.6 动物收容所
动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置的LinkedList数据结构。
enqueue方法有一个animal参数,animal[0]代表动物编号,animal[1]代表动物种类,其中 0 代表猫,1 代表狗。
dequeue*方法返回一个列表[动物编号, 动物种类],若没有可以收养的动物,则返回[-1,-1]。
示例1:
输入:
[“AnimalShelf”, “enqueue”, “enqueue”, “dequeueCat”, “dequeueDog”, “dequeueAny”]
[[], [[0, 0]], [[1, 0]], [], [], []]
输出:
[null,null,null,[0,0],[-1,-1],[1,0]]
示例2:
输入:
[“AnimalShelf”, “enqueue”, “enqueue”, “enqueue”, “dequeueDog”, “dequeueCat”, “dequeueAny”]
[[], [[0, 0]], [[1, 0]], [[2, 1]], [], [], []]
输出:
[null,null,null,null,[2,1],[0,0],[1,0]]
class AnimalShelf {
Queue<int[]> dogs;
Queue<int[]> cats;
private static final int[] defaultans = {-1, -1};
public AnimalShelf() {
dogs = new LinkedList<>();
cats = new LinkedList<>();
}
public void enqueue(int[] animal) {
if(animal[1] == 0){
cats.offer(animal);
}else{
dogs.offer(animal);
}
}
public int[] dequeueAny() {
if(cats.isEmpty() && dogs.isEmpty()){
return defaultans;
}else{
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
设计模式学习笔记
设计模式系列学习视频
- 以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。
PPc7W-1711189395978)]
[外链图片转存中…(img-Dk5FXOrp-1711189395980)]
[外链图片转存中…(img-YMk61z9U-1711189395981)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-V3SRaaKB-1711189395981)]
设计模式学习笔记
[外链图片转存中…(img-BW3KPBQI-1711189395982)]
设计模式系列学习视频
[外链图片转存中…(img-iLuh3HNW-1711189395982)]
- 以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。