这道题考查栈的知识点,要求实现一个栈,在对这个栈进行入栈和出栈以及返回最小栈元素时要求时间复杂度为O(1)。
方法一:
用两个栈,一个正常出入栈,另一个存最小栈,入栈的时候第一个站正常入,最小栈如果为空或者要入的data比最小栈的栈顶元素小的时候才给最小栈入栈。否则每次入栈的时候就将最小栈的栈顶元素再入。例如下图:
这样的话,出栈也是正常出,我们找最小元素的时候直接找最小栈的栈顶就ok了。代码如下:
#pragma once
#include"Stack.h"
typedef struct {
Stack s;
Stack m;
}MinStack;
void MinStackInit(MinStack *pMS)
{
StackInit(&(pMS->s));
StackInit(&(pMS->m));
}
void MinStackPush(MinStack *pMS,datatype data)
{
assert(pMS);
StackPush(&pMS->s, data);
if (StackEmpty(&pMS->m) || data < StackTop(&pMS->m))
{
StackPush(&pMS->m, data);
}
else {
StackPush(&pMS->m, StackTop(&pMS->m));
}
}
void MinStackPop(MinStack *pMS)
{
assert(pMS);
StackPop(&(pMS->s));
StackPop(&(pMS->m));
}
datatype MinStackTop(MinStack *pMS)
{
return StackTop(&pMS->s);
}
datatype MinStackMin(MinStack *pMS)
{
return StackTop(&pMS->m);
}
方法二:
和方法一差不多,比方法一简单一些,就是给最小栈入栈的时候,如果最小栈为空或者data比最小栈的栈顶元素小,再入栈,否则最小栈不入栈;出栈的时候正常栈正常出,只有当正常栈的栈顶元素和最小栈的栈顶元素相等的时候才给最小栈出栈;最小栈元素依然是去最小栈的栈顶元素。如下图:
代码如下:
#pragma once
#include"Stack.h"
typedef struct {
Stack s;
Stack m;
}MinStack;
void MinStackInit(MinStack *pMS)
{
StackInit(&(pMS->s));
StackInit(&(pMS->m));
}
void MinStackPush(MinStack *pMS,datatype data)
{
assert(pMS);
StackPush(&pMS->s, data);
if (StackEmpty(&pMS->m) || data < StackTop(&pMS->m))
{
StackPush(&pMS->m, data);
}
}
void MinStackPop(MinStack *pMS)
{
assert(pMS);
StackPop(&(pMS->s));
datatype t1 = StackTop(&pMS->s);
datatype t2 = StackTop(&pMS->m);
if(t1==t2)
{
StackPop(&(pMS->m));
}
}
datatype MinStackTop(MinStack *pMS)
{
return StackTop(&pMS->s);
}
datatype MinStackMin(MinStack *pMS)
{
return StackTop(&pMS->m);
}