【数据结构】实现一个栈要求实现Push(出栈)Pop(入栈)Min(返回最小值)的时间 复杂度为O(1)


栈的基本实现: https://blog.csdn.net/weixin_41892460/article/details/82973851

思路

在一个栈里面封装两个栈,一个存储所有入栈的数据,一个是最小栈存储每次入栈出栈的最小值,入栈的时候判断入栈元素与最小栈栈顶元素的大小,如果小于两个都入栈,如果大于就不在最小栈入栈。

MinStack.h

#ifndef   __MINSTACK_H__
#define   __MINSTACK_H__

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

typedef int DataType;

typedef struct  Stack1
{
	DataType* a;
	size_t top1;
	size_t  capacity1;
}Stack1;

typedef struct  Stack2
{
	DataType* a;
	size_t top2;
	size_t  capacity2;
}Stack2;

typedef struct Stack
{
	Stack1 s1;
	Stack2 s2;
}Stack;

void StackInit(Stack* s);
void StackPush(Stack* s, DataType x);
void StackPop(Stack* s);
size_t StackSize(Stack* s);
int StackEmpty(Stack* s);
void StackDestory(Stack* s);
int StackMindata(Stack* s);
void text();


#endif 

MinStack.c

#include "MinStack.H"

void StackInit(Stack* s)
{
	assert(s);
	s->s1.a = (DataType*)malloc(sizeof(DataType));
	s->s1.top1 = 0;
	s->s1.capacity1 = 10;
	s->s2.a = (DataType*)malloc(sizeof(DataType));
	s->s2.top2 = 0;
	s->s2.capacity2 = 10;
}


void StackDestory(Stack* s)
{
	assert(s);
	s->s1.a = NULL;
	s->s1.top1 = 0;
	s->s1.capacity1 = 0;
	free(s->s1.a);
	s->s1.a = NULL;
	s->s1.top1 = 0;
	s->s1.capacity1 = 0;
	free(s->s1.a);
	s = NULL;
}
void StackPush(Stack* s, DataType x)
{
	assert(s);
	//栈满,开辟新的空间
	DataType* cur1;
	DataType* cur2;
	if (s->s1.top1 == s->s1.capacity1&&s->s2.top2 == s->s2.capacity2)
	{
		cur1 = (DataType*)realloc(s->s1.a, sizeof(s->s1.capacity1) * 2);
		if (cur1 != NULL)
		{
			s->s1.a = cur1;
		}
		s->s1.capacity1 *= 2;

		cur2 = (DataType*)realloc(s->s1.a, sizeof(s->s2.capacity2) * 2);
		if (cur2 != NULL)
		{
			s->s2.a = cur2;
		}
		s->s2.capacity2 *= 2;
	}
	//有空间

	if (s->s1.top1 == 0 && s->s2.top2 == 0)
	{
		//值都入俩个栈
		s->s1.a[s->s1.top1++] = x;
		s->s2.a[s->s2.top2++] = x;
	}

	//如果s2的栈顶元素小于所要入的值则只入到s1
	else if (s->s2.a[s->s2.top2 - 1] >= x)
	{
		s->s1.a[s->s1.top1++] = x;
		s->s2.a[s->s2.top2++] = x;
	}
	else
	{
		s->s1.a[s->s1.top1++] = x;
	}




	//assert(s);
	//StackPush(&s->s1, x);
	//if (StackEmpty(&s->s2 == 0)
	//	|| s->s2.a[s->s2.top2 - 1] >= x)
	//{
	//	StackPush(&s->s1, x);
	//}



}


void StackPop(Stack* s)
{
	assert(s);
	assert(s->s2.top2 > 0);
	if (s->s1.top1 == 0 && s->s2.top2 == 0)
	{
		printf("栈已空!!!");
		return;
	}
	if (s->s1.a[s->s1.top1] == s->s2.a[s->s2.top2 - 1])
	{
		s->s2.top2--;
		s->s1.top1--;
	}
	else
	{
		s->s2.top2--;
	}
}


int StackMindata(Stack* s)
{
	assert(s);
	if (s->s1.top1 == 0 && s->s2.top2 == 0)
	{
		printf("栈已空!!!");
		return 0;
	}
	return (s->s2.a[s->s2.top2 - 1]);

}



size_t StackSize(Stack* s)
{
	assert(s);
	assert(s->s1.top1);
	assert(s->s2.top2);
	s->s1.top1++;
	s->s2.top2++;
	return s->s1.top1 + s->s2.top2;
}



int StackEmpty(Stack* s)
{
	assert(s);
	return (s->s1.top1) || (s->s2.top2) == 0 ? 0 : 1;
}

Test.c

#include "MinStack.H"



void text()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 6);
	StackPush(&s, 5);
	StackPush(&s, 6);
	StackPush(&s, 5);
	StackPush(&s, 4);
	StackPush(&s, 6);
	StackPush(&s, 5);
	StackPush(&s, 4);
	StackPush(&s, 0);
	printf("Mindata: %d\n", StackMindata(&s));
}



int main()
{
	text();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41892460/article/details/83750981