-
问题:
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最大元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMax() -- 检索栈中的最大元素。
-
思路分析:
一个存储所有最大值的栈maxST;
1. 当push入栈的元素大于当前最大元素,将该元素压入最大值栈maxST;
2.maxST的栈顶始终保存栈中当前的最大元素;
3. 当前最大元素被pop出栈时,将maxST栈顶的对应最大元素也弹出栈,getMax操作即为获得maxST栈顶最大元素。
具体实现代码如下:
-
MaxStack.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct MaxStack
{
int* pst;
int stTop;
int* pmaxST;
int maxSTTop;
}MaxStack;
MaxStack* maxStackCreate(int maxSize);
void maxStackPush(MaxStack* obj, int x);
void maxStackPop(MaxStack* obj);
int maxStackTop(MaxStack* obj);
int maxStackGetMax(MaxStack* obj);
int maxStackEmpty(MaxStack* obj);
void maxStackFree(MaxStack* obj);
-
MaxStack.c
#include "MaxStack.h"
MaxStack* maxStackCreate(int maxSize)
{
MaxStack* pst = (MaxStack*)malloc(sizeof(MaxStack));
pst->pst = (int*)malloc(sizeof(int)*maxSize);
pst->stTop = 0;
pst->pmaxST = (int*)malloc(sizeof(int)*maxSize);
pst->maxSTTop = 0;
return pst;
}
void maxStackPush(MaxStack* obj, int x)
{
int* pst = obj->pst;//正常栈
int* pmaxST = obj->pmaxST;//最大栈
pst[obj->stTop++]=x;
if (obj->maxSTTop == 0 || x >= pmaxST[obj->maxSTTop - 1])
{
pmaxST[obj->maxSTTop++]=x;
}
}
void maxStackPop(MaxStack* obj)
{
int* pst = obj->pst;
int* pmaxST = obj->pmaxST;
if (pst[obj->stTop - 1] == pmaxST[obj->maxSTTop - 1])
{
obj->maxSTTop--;
}
obj->stTop--;
}
int maxStackTop(MaxStack* obj)
{
return obj->pst[--obj->stTop];
}
int maxStackGetMax(MaxStack* obj)
{
return obj->pmaxST[obj->maxSTTop - 1 ];
}
int maxStackEmpty(MaxStack* obj)
{
if(obj->stTop == 0 )
{
return 1;
}
return 0;
}
void maxStackFree(MaxStack* obj)
{
free(obj->pst);
free(obj->pmaxST);
free(obj);
}
-
test.c
#include "MaxStack.h"
void maxStackTest()
{
MaxStack* pms = maxStackCreate(10);
maxStackPush(pms, 1);
maxStackPush(pms, 5);
maxStackPush(pms, 15);
maxStackPush(pms, 15);
maxStackPush(pms, 7);
maxStackPush(pms, 8);
if (!maxStackEmpty(pms))
{
printf("top:%d\n", maxStackGetMax(pms));
}
}
int main()
{
maxStackTest();
system("pause");
return 0;
}