题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN_STACK 10
typedef struct
{
int stackList[MAX_LEN_STACK];
int top;
}stack;
/*辅助栈空间,存储最小值*/
stack minStack = {0};
/*初始化栈*/
int initStack(stack* s)
{
if (s == NULL)
{
return -1;
}
s->top = -1;
minStack.top = -1;
}
/*获取栈顶元素*/
int top(stack* s)
{
if (s==NULL || s->top<0)
{
return -1;
}
return s->stackList[s->top];
}
/*将元素添加到栈里面*/
int push(stack* s, int data)
{
int topData;
if (s->top == MAX_LEN_STACK-1)
{
return -1;
}
s->stackList[++(s->top)] = data;
/*先修改辅助栈,如果比当前辅助栈的值小,则更新为当前栈,如果比当前大,还用之前的最小值*/
if (minStack.top < 0)
{
minStack.stackList[++minStack.top] = 0; /*第一个默认为0,这里记录栈下标*/
}
else
{
topData = top(&minStack);
if (s->stackList[topData] < data)
{
minStack.stackList[++minStack.top] = topData;
}
else
{
minStack.stackList[++minStack.top] = s->top; /*记录索引值*/
}
}
return 0;
}
/*出栈*/
int pop(stack* s)
{
if (s==NULL || s->top<0)
{
return -1;
}
minStack.top--;
return s->stackList[s->top--];
}
/*获取当前栈的最小值*/
int min(stack* s)
{
if (s==NULL || s->top<0)
{
return -1;
}
return s->stackList[minStack.stackList[minStack.top]];
}
/*判断当前栈是否为空*/
bool empty(stack* s)
{
return (s->top<0) ? true:false;
}
int main()
{
stack s;
int a[] = {96, 4, 2, 34, 232, 22, 1};
int i;
initStack(&s);
for (i=0; i<7; i++)
{
push(&s, a[i]);
printf("data %d, min %d\n", a[i], min(&s));
}
while (!empty(&s))
{
printf("pop %d\n", pop(&s));
printf("min %d\n", min(&s));
}
return 0;
}