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

【資料結構】實現一個棧要求實現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;
}