1.剑指 Offer 09. 用两个栈实现队列
第一眼完全没看懂题呢!
反思:该题没有考虑到把stack1的内容pop到stack2中之后stack1就空了。必须加stack2栈空的判断,这样第二次删除可以直接从stack2输出。
怎么做:
1.Stack
2.Deque
双端数列。Java数据结构之Deque(双端队列)_Jason&Zhou的博客-CSDN博客_deque(双端队列)也可以用作lifo(后进先出)堆栈(也就是栈),last in first o
3.LinkedList
LinkedListAPI方法大全
总而言之是个链表,且有实现队列、栈等的接口。
在这里链表不需要考虑数组的扩容问题,故效率会比较不错。 原因的话是Stack继承了Vector接口,而Vector底层是一个Object[]数组,那么就要考虑空间扩容和移位的问题了。(来自评论区大佬)
不熟的知识点:
LinkedList(Collection<? extends E> c):
构造一个包含指定 collection 中的元素的列表
这些元素按其 collection 的迭代器返回的顺序排列。
1.Collection 集合:
属于单列集合的顶层接口。与数组不同,长度可变且存储的都是引用数据类型。如果想存储基本类型数据需要存储对应的包装类型。分为可重复的List和不可重复的Set。
2.泛型:
<>,就是指在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象)再进行类型的定义。会在编译期检查类型是否错误。
public class MyClass<T> {T value1;}
类声明后的<>中这个T被称为类型参数,用于指代任意类型。实际上这个T只是个代表,写什么都可以。表示此时的value1,value2都是在类定义时没有明确类型,只有在使用时才告知编译器类型。出于规范,类型参数用单个的大写字母来代替。
常见如下:T任意类,E异常或者Element,K与V搭配使用。
通配符:
<?> 一般用在方法参数,表示可以接受该类所有类型的泛型变量。
<? extends 类> 表示?可以指代任何类型
但是该类型必须是后面类的子类。此时?可以指代任意E类及其子类的类型。
2.剑指 Offer 30. 包含min函数的栈
经过第一题后第二题理所当然地想用LinkedList做...但此时还不知道PriorityQueue的我写的十分冗余...
反思:第一时间应该是思考,而不是翻开API方法开始找方法。
怎么做
整体思路:记录当前链表的min,每push一个就新增一个”当前最小结点“。
1.Node(需自己定义)
2.Queue
3.LinkedList
4.PriorityQueue
5.int Min 评论区大佬利用栈来存储上一个最小值 很妙
class MinStack {
public:
/** initialize your data structure here. */
int Min=INT_MAX;
stack<int> st;
MinStack() {
}
void push(int x) {
st.push(Min);//加入上一个最小值
if(x<Min) Min=x;//更新最小值
st.push(x);//加入该数值
}
void pop() {
st.pop();//pop掉该数值
Min=st.top();//得到去掉该值后的最小值
st.pop();//将该最小值也pop掉
}
int top() {
return st.top();//返回栈顶即可
}
int min() {
return Min;
}
};