【数据结构】最大栈问题

  • 问题:

设计一个支持 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值