1. 描述
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及pop 的时间复杂度都是O(1)。
这是2010年Google的一道面试题。
2. 求解
思路是这样的, 定义另外一个辅助栈,不妨叫MinStack,栈中存放数据栈(不妨叫Stack)中当前最小元素在数据栈中的标号。当向数据栈中push 元素(不妨叫ele)的时候:若当前数据栈中最小的元素大于ele,则把ele压入数据栈的同时,把此元素在数据栈中的标号压入MinStack,否则只把ele压入数据栈中。从数据栈中pop元素的时候:若pop出的元素的标号正好是当前数据栈的最小值,则pop Stack的同时pop MinStack,否则之pop Stack。
代码如下:
#define N 50
#define Type int
typedef struct MinStack {
int index[N];
int top;
}MinStack;
typedef struct Stack {
Type data[N];
int top;
MinStack *M;
}Stack;
void pop(Stack *s){
if (s->top <= 0) return;
if (s->top - 1 == s->M->index[s->M->top - 1]) {
s->M->top--;
}
s->top--;
}
void push(Stack *s, Type ele)
{
if (s->top > 0 && s->data[s->M->index[s->M->top - 1]] > ele) {
s->M->index[s->M->top++] = s->top;
}
if (s->top == 0)
s->M->index[s->M->top++] = 0;
s->data[s->top++] = ele;
}
Type min(Stack *s)
{
if (s->top > 0)
return s->data[s->M->index[s->M->top - 1]];
}