设计MinStack
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
思路1:利用辅助栈,只push最小的进去,当baseStack栈顶值等于minStack栈顶值,辅助栈pop出。
class MinStack {
Deque<Integer> baseStack;
Deque<Integer> minStack;
public MinStack() {
baseStack = new LinkedList<>();
minStack = new LinkedList<>();
}
public void push(int x) {
baseStack.push(x);
if (minStack.isEmpty() || minStack.peek() >= x){
minStack.push(x);
}
}
public void pop() {
if (!baseStack.isEmpty()){
Integer num = baseStack.pop();
if (minStack.peek().equals(num)){
minStack.pop();
}
}
}
public int top() {
return baseStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
思路2:通过两个数组实现
#define MAXSIZE 30001
typedef struct {
int *stk;
int *min;
int top;
} MinStack;
MinStack* minStackCreate() {
MinStack* stack = malloc(sizeof(MinStack));
stack->stk = malloc(sizeof(int)*MAXSIZE);
stack->min = malloc(sizeof(int)*MAXSIZE);
stack->top = 0;
return stack;
}
void minStackPush(MinStack* obj, int val) {
if(obj->top > MAXSIZE){
return;
}else{
if(obj->top==0){
obj->min[obj->top] = val;
}else{
obj->min[obj->top] = fmin(obj->min[obj->top-1],val);
}
obj->stk[obj->top++] = val;
}
}
void minStackPop(MinStack* obj) {
--obj->top;
}
int minStackTop(MinStack* obj) {
return obj->stk[obj->top-1];
}
int minStackGetMin(MinStack* obj) {
return obj->min[obj->top-1];
}
void minStackFree(MinStack* obj) {
free(obj->stk);
free(obj->min);
free(obj);
}
思路3: 用两倍空间,每次在栈添加新元素的时候,多加一个元素来存放当前的最小值
class MinStack {
public:
stack<int> s;
public:
MinStack() {
}
void push(int x) {
if(s.empty())
{
s.push(x);
s.push(x);
}
else
{
int tmp = s.top();
s.push(x);
s.push(tmp<=x?tmp:x);
}
}
void pop() {
s.pop();
s.pop();
}
int top() {
int tmp = s.top();
s.pop();
int tmp2 = s.top();
s.push(tmp);
return tmp2;
}
int getMin() {
return s.top();
}
};