定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)

    具体实现代码如下:

stack.h内容如下:

#ifndef _STACK_H_
#define _STACK_H_
#define NUM 256
typedef struct _tagStack
{
	int m_Array[NUM];
	int m_nTop;
}Stack;
void InitStack(Stack * pStack);
int Push(Stack * pStack, int nNum);
int Pop(Stack * pStack);
int IsEmtpy(Stack * pStack);
int Top(Stack * pStack);
void PrintStack(Stack * pStack);
int GetMin(Stack * pStack);
#endif
stack.cpp的内容如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stack.h"

Stack TempStack = { 0 };
int nMinIndex = -1;

void InitStack(Stack * pStack)
{
	if (!pStack)
		return;
	memset(pStack->m_Array, 0, NUM);
	pStack->m_nTop = -1;
	memset(TempStack.m_Array, 0, NUM);
	TempStack.m_nTop = -1;
	return;
}

int Push(Stack * pStack, int nNum)
{
	if (!pStack)
		return 0;
	if (pStack->m_nTop + 1 >= NUM)
		return 0;
	if (nMinIndex == -1)
	{
		nMinIndex = 0;
		TempStack.m_nTop++;
		TempStack.m_Array[TempStack.m_nTop] = nMinIndex;
	}
	else
	{
		if (nNum < pStack->m_Array[nMinIndex])
		{
			nMinIndex = pStack->m_nTop + 1;
		}
		TempStack.m_nTop++;
		TempStack.m_Array[TempStack.m_nTop] = nMinIndex;
	}
	pStack->m_nTop++;
	pStack->m_Array[pStack->m_nTop] = nNum;
	return 1;
}

int Pop(Stack * pStack)
{
	int nRet = 0;
	if (!pStack)
		return 0;
	if (pStack->m_nTop < 0)
		return 0;
	nRet = pStack->m_Array[pStack->m_nTop--];
	TempStack.m_nTop--;
	return 1;
}

int IsEmtpy(Stack * pStack)
{
	if (!pStack)
		return -1;
	if (pStack->m_nTop == -1)
		return 1;
	return 0;
}

int Top(Stack * pStack)
{
	if (!pStack)
		return 0;
	if (pStack->m_nTop < 0)
		return 0;
	return pStack->m_Array[pStack->m_nTop];
}

void PrintStack(Stack * pStack)
{
	int i = 0;
	if (!pStack)
		return;
	printf("栈元素:
");
	for (i = 0; i <= pStack->m_nTop; i++)
	{
		printf("%d	", pStack->m_Array[i]);
	}
	printf("
");
	return;
}

int GetMin(Stack * pStack)
{
	if (!pStack)
		return 0;
	if (TempStack.m_nTop >= 0)
	{
		if (pStack->m_nTop == TempStack.m_nTop)
		{
			return pStack->m_Array[TempStack.m_Array[TempStack.m_nTop]];
		}
	}		
	return -1;
}
main.cpp的内容如下:

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"
void main()
{
	Stack MyStack;
	InitStack(&MyStack);
	Push(&MyStack, 3);
	Push(&MyStack, 4);
	Push(&MyStack, 5);
	Push(&MyStack, 2);
	Push(&MyStack, 1);
	PrintStack(&MyStack);
	printf("最小值:
");
	while (IsEmtpy(&MyStack) != 1)
	{
		printf("%d
", GetMin(&MyStack));
		Pop(&MyStack);
	}
	system("pause");
	return;
}
运行效果如图1所示:

图1 运行效果



原文地址:https://www.cnblogs.com/new0801/p/6176937.html