设计
1.实现队列:两个栈实现s1, s2
队列的append方法:s1入栈
队列的delete方法:把s1→s2,return s2.pop
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
}
if(stack2.empty()){
return -1;
}
return stack2.pop();
2.实现包含min的栈:
public void push(int x) {
if(x <= min){
obj.push(min);// 把第二小的值保存在栈中最小值附近
在pop时候如果移除最小值 由次小代替
min = x;
}
obj.push(x);
}
public void pop() {
if(obj.pop() == min){// 移除最小值则pop两次,获取次小值
min = obj.pop();
}
}
3.队列并实现函数 max_value 得到队列里的最大值
思想:维护一个max队列,根据先进先出,后到的较大元素应该排除先前较小的元素,而后到的较的元素则跟在较大的元素后
// max队列队首就是最大值
public int max_value() {
if(maxQueueHead == maxQueueTail) return -1;
return maxQueue[maxQueueHead];
}
// 新增元素
public void push_back(int value) {
queue[queueTail++] = value;
// 后到的较大的元素把max队列中小的挤掉
while(maxQueueHead != maxQueueTail && maxQueue[maxQueueTail-1] < value) maxQueueTail--;
maxQueue[maxQueueTail++] = value;
}
// 如果移除元素与max相同,则更新max队列
public int pop_front() {
if(queueHead == queueTail) return -1;
int res = queue[queueHead++];
if(res == maxQueue[maxQueueHead]) maxQueueHead++;
return res;
}