数据结构 实现一个栈:取栈中的最小值的时间复杂度为O(1)

解题思路:

    每次入栈两个元素,一个为将要入栈的value元素,一个位min最小元素。

    第一次入栈时,将该元素设为min值,入栈两次该元素。此后,每次入栈value都需和min值比较,若比min值小,则min数据更新为该值。若大于min,则min不变。

    此后,先入栈value元素,后入栈min。这样就保证了栈顶元素始终为最小值min。


下面上代码:

#include"minStack.h"

void minStackInit(minStack* stack)
{
	if(stack == NULL)
	{
		//非法输入
		return;
	}
	stack->size = 0;
	stack->capacity = 1000;
	stack->data = (minStackType*)malloc(stack->capacity * sizeof(minStackType));
}

void minStackDestroy(minStack* stack)
{
	if(stack == NULL)
	{
		//非法输入
		return;
	}
	free(stack->data);
	stack->size = 0;
	stack->capacity = 0;
	return;
}

void minStackPrint(minStack* stack,char* msg)
{
	printf("[%s]\n",msg);
	if(stack == NULL)
	{
		//非法输入
		return;
	}
	if(stack->size == 0)
	{
		//空栈
		return;
	}
	int i = 0;
	for(;i < stack->size;i++)
	{
		printf("%c ",stack->data[i]);
	}
	printf("\n");
}

void minStackPush(minStack* stack,minStackType value)
{
	if(stack == NULL)
	{
		//非法输入
		return;
	}
	if(stack->size >= stack->capacity)
	{
		//栈已满
		return;
	}
	//假设要插入的值就是最小值
	minStackType min = value;
	if(stack->size == 0)
	{
		stack->data[stack->size++] = value;
		stack->data[stack->size++] = min;
		return;
	}
	if(stack->data[stack->size] < min)
	{
		//如果栈顶元素小于min,则让min的值为栈顶元素
		min = stack->data[stack->size - 1];
	}
	//先入栈value,再入栈min,确保min在栈顶
	stack->data[stack->size++] = value;
	stack->data[stack->size++] = min;
}

void minStackPop(minStack* stack)
{
	if(stack == NULL)
	{
		//非法输入
		return;
	}
	if(stack->size == 0)
	{
		//空栈
		return;
	}
	stack->size -= 2;
	return;
}

int minStackGet(minStack* stack,minStackType* value)
{
	if(stack == NULL)
	{
		//非法输入
		return 0;
	}
	if(stack->size == 0)
	{
		//空栈
		return 0;
	}
	*value = stack->data[stack->size-1];
	return 1;
}
////////////////////////////////////////////////////
//                 以下为测试函数                   //
////////////////////////////////////////////////////


void TestminStackPush()
{
	TITLE;
	minStack stack;
	minStackInit(&stack);
	minStackPush(&stack,'a');
	minStackPrint(&stack,"入栈一个元素");
	minStackPush(&stack,'c');
	minStackPush(&stack,'d');
	minStackPrint(&stack,"再入栈两个元素");

}

void TestminStackPop()
{
	TITLE;
	minStack stack;
	minStackInit(&stack);
	minStackPush(&stack,'a');
	minStackPush(&stack,'c');
	minStackPush(&stack,'d');
	minStackPrint(&stack,"入栈三个元素");
	minStackPop(&stack);	
	minStackPrint(&stack,"出栈一个元素");
}
void TestminStackGet()
{
	TITLE;
	minStack stack;
	minStackType value;
	minStackInit(&stack);
	minStackPush(&stack,'a');
	minStackPush(&stack,'c');
	minStackPush(&stack,'d');
	minStackPrint(&stack,"入栈三个元素");
	int ret = minStackGet(&stack,&value);
	printf("[取栈最小值]\n");
	printf("expect is 1,actul is %d\n",ret);
	printf("expect is a,actul is %c\n",value);
}

int main()
{
	TestminStackPush();
	TestminStackPop();
	TestminStackGet();
	return;
}
#pragma once

#include<stdio.h>
#include<stdlib.h>

#define TITLE printf("\n=====================%s======================\n",__FUNCTION__);

typedef char minStackType;

typedef struct minStack
{
	minStackType* data;
	int size;
	int capacity;	
}minStack;


void minStackInit(minStack* stack); //初始化
void minStackDestroy(minStack* stack); // 销毁
void minStackPrint(minStack* stack,char* msg); //打印栈
void minStackPush(minStack* stack,minStackType value);//入栈
void minStackPop(minStack* stack);//出栈
int minStackGet(minStack* stack,minStackType* value);//取栈顶元素,失败返回0,成功返回1

运行结果演示:


如图可见栈顶元素始终未最小值 a 。

猜你喜欢

转载自blog.csdn.net/ihaha233/article/details/80354409