难度简单439
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
示例 1:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1]
示例 2:
输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
/**
* 解题思路;
* 栈:先进后出
* 队列:先进先出
* 两个栈。一个作为入栈,一个作为出栈
* 想要出站时,将“入栈”中的元素全部弹出,压入“出栈”(但也要在“出栈”为空的情况下,否则,弹出“出栈”)
*/
class CQueue {
Stack<Integer> stack1;//“入队列”
Stack<Integer> stack2;//"出队列“
//创建队列
public CQueue() {
stack1=new Stack<>();
stack2=new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if(stack1.empty()&&stack2.empty())//当入栈和出栈都为空时,无元素可弹 返回-1
return -1;
if(stack2.empty()) {//当“出栈”为空时,对“入栈”中的元素进行弹出,并压到“出栈”中
while (!stack1.empty()) {
int temp = stack1.pop();
stack2.push(temp);
}
}
//当“出栈”不为空,并且入栈元素全部压如出栈中后,弹出顶部元素
return stack2.pop();
}
}
难度简单278
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
提示:
- 各函数的调用总次数不超过 20000 次
/**
* 解题思路:
* 用另外一个栈记录随着元素的入栈从而新增的最小值
* 得到当前状态下的最小值后(经过入栈、出栈后)
* 需要考虑到当前出栈的值可能是当前状态下的最小值,那么就需要在记录最小值的栈中删除该值
*/
class MinStack {
Stack<Integer> stack;//记录入栈元素
Stack<Integer> ministack;//记录每个状态下的最小值
//初始化改良后的栈 可查询当前状态下的最小值
public MinStack() {
stack=new Stack<>();
ministack=new Stack<>();
}
//每次入栈的元素都需要考虑其是否是当前状态的最小值,是否需要入最小值栈
public void push(int x) {
if(stack.empty())//每当入栈为空后第一个加入的值,理所应当是当前状态下的最小值
ministack.push(x);
else if (x<=ministack.peek()) //每次入栈的值与上一状态的最小值进行对比,如果不大于其值,那么就入最小值栈
ministack.push(x);
stack.push(x);
}
//每次弹栈的时候,都要注意弹出的值是否是当前状态的最小值,如果是,也要在最小值栈中删除
public void pop() {
if(stack.peek().equals(ministack.peek()))//这里不能使用== ==只能用于基本数据类型的值比较,放在引用数据类型上就是内训地址的比较
ministack.pop();
stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return ministack.peek();
}
}