思路:
用两个栈,一个数据栈一个Min栈,
入栈:当data<=min,data同时压入数据栈和Min栈
出栈:检测data与Min栈栈顶的元素是否相同 相同:两个栈同时出栈 不相同:只对数据栈进行出栈
获取最小值:取Min栈栈顶元素
#define max 10
typedef char DataType;
typedef struct Stack
{
int top;
DataType stack[max];
}Stack;
typedef struct Min
{
Stack S;
Stack Min;
}Min;
void InterviewInit(Min* m);//初始化
void InterviewPush(Min* m, DataType data);//入栈
void InterviewPop(Min* m);//出栈
int InterviewMin(Min* m);//获取最小值
void StackInit(Stack* p)//初始化栈
{
assert(p);
p->top = 0;
}
void StackPush(Stack* p, DataType data)//入栈
{
assert(p);
if (p->top <= max)
{
p->stack[p->top] = data;
p->top++;
}
else
{
printf("stack full\n");
}
}
int StackPop(Stack* p)//出栈
{
//int ch;
assert(p);
if (p->top != 0)
{
p->top--;
//ch = p->stack[p->top];
return p->stack[p->top];
}
}
int StackNum(Stack* p)//计算栈内元素
{
assert(p);
return p->top;
}
int StackTop(Stack* p)//栈顶元素
{
int n;
assert(p);
if(p->top)
{
n = p->top;
return p->stack[n-1];
}
return 0;
}
void InterviewInit(Min* m)//初始化
{
assert(m);
StackInit(&m->Min);
StackInit(&m->S);
//m->Min->top = 0;
}
void InterviewPush(Min* m, DataType data)//入栈
{
assert(m);
StackPush(&m->S,data);
if (0 == StackNum(&m->Min))
{
StackPush(&m->Min, data);
}
else
{
if (data <= StackTop(&m->Min))
{
StackPush(&m->Min, data);
}
}
}
void InterviewPop(Min* m)//出栈
{
assert(m);
if (StackNum(&m->S))
{
if (StackTop(&m->S) == StackTop(&m->Min))
{
StackPop(&m->S);
StackPop(&m->Min);
}
else
StackPop(&m->S);
}
}
int InterviewMin(Min* m)//返回最小值
{
assert(m);
return StackTop(&m->Min);
}
void test1()//测试
{
Min m;
InterviewInit(&m);
InterviewPush(&m, 1);
InterviewPush(&m, 2);
InterviewPush(&m, 3);
InterviewPush(&m, 1);
InterviewPush(&m, 4);
int a = InterviewMin(&m);
InterviewPop(&m);
InterviewPop(&m);
InterviewPop(&m);
a = InterviewMin(&m);
}