1. 程式人生 > >實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間複雜度為O(1)

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間複雜度為O(1)

這道題考查棧的知識點,要求實現一個棧,在對這個棧進行入棧和出棧以及返回最小棧元素時要求時間複雜度為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);
}