zoukankan      html  css  js  c++  java
  • 定义一个栈的数据结构,要求实现一个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 运行效果



  • 相关阅读:
    Linux下压缩解压缩命令
    Linux挂载外部设备
    Ubuntu下安装软件的三种方式
    Linux查看和修改文件权限
    Linux命令行基础操作
    window下常用的cmd命令
    圆角进度条,带数字居中显示的圆角进度条
    上下滑动控件
    window下Jekyll+github搭建自己的博客
    PAT 团体程序设计天梯赛 L1-046 整除光棍(模拟除法)
  • 原文地址:https://www.cnblogs.com/new0801/p/6176937.html
Copyright © 2011-2022 走看看