文章目录
Day1:
- 用两个栈实现队列
- 包含min函数的栈
一、用两个栈实现队列OJ链接
本题思路:定义两个栈,(Enqueue)是用来存储入队的元素,(Cnqueue)用来出队的,那么如何进行操作呢,首先,如果插入一个数据肯定放入Enqueue中去,比较繁琐的就是出队如何实现,这里需要考虑一下如果当前Cnqueue中有元素,那么就直接返回栈顶元素即可,如果上面的不满足,就会有两种情况发生一种是Enqueue中没有元素,那么直接返回-1即可,另外一种是Enqueue中存在元素,那么需要将此时在Enqueue中的所有元素放入Cnqueue中去。
只要记住一点所有元素出队的操作都是在Cnqueue中完成即可。
class CQueue {
public Stack<Integer> Enqueue=new Stack<>();
public Stack<Integer> Cnqueue=new Stack<>();
public CQueue() {}
public void appendTail(int value) {
Enqueue.push(value);
}
public int deleteHead() {
if(!Cnqueue.isEmpty()) return Cnqueue.pop();
if(Enqueue.isEmpty()) return -1;
while(!Enqueue.isEmpty()) Cnqueue.push(Enqueue.pop());
return Cnqueue.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
二、包含min函数的栈OJ链接
本题思路:定义两个栈,DataStack是用来用来存储每次每一次对栈进行的操作,另外一个TmpStack是用来辅助存储非递增的序列。本题求最小的min函数就是取辅助栈的栈顶元素即可,对于push操作一个是对于数据栈操作,还有一个是需要判断是否能够进行到非递增的辅助栈中去操作。
class MinStack {
/** initialize your data structure here. */
public Stack<Integer> DataStack=new Stack<>();
public Stack<Integer> TmpStack=new Stack<>();
public MinStack() {}
public void push(int x) {
DataStack.push(x);
if(TmpStack.empty()||TmpStack.peek()>=x)
TmpStack.push(x);
}
public void pop() {
if(DataStack.pop().equals(TmpStack.peek()))
TmpStack.pop();
}
public int top() {
return DataStack.peek();
}
public int min() {
return TmpStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/