在栈中增加min函数

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数min、push以及pop的时间复杂度都是O(1)。

算法:在栈中设置一个辅助栈来保存最小值

代码:

/**
为栈增加一个min函数,获取栈中的最小值,复杂度为1
** author :xiaozhi xiong
** date:2014-02-08
**/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int MAX_STACK=50;
struct stack
{
	int a[50];
	int min[50 ];
	int top;
	int top_min;
};
//初始化栈
void InitStack(struct stack *p)
{

   p->top=-1;
   p->top_min=-1;
}
//入栈
void PushStack(struct stack* p,int value)
{
	if(p->top>MAX_STACK)
	{
		printf("栈满\n");
		return;
	}
	else
	{
		if(p->top_min==-1)
		{
			p->a[++p->top]=value;
			p->min[++p->top_min]=value;
		}
		else
		{
			p->a[++p->top]=value;
			if(p->min[p->top_min]>=value)
				p->min[++p->top_min]=value;
		}
	}
}
int PopStack(struct stack *p)
{
	int value;
	if(p->top==-1)
	{
		printf("空栈\n");
		return -999;
	}
	else
	{
		value=p->a[p->top];
		p->a[p->top--];
		if(value==p->min[p->top_min])
		{
			p->top_min--;
		}
		return value;
	}
}
int GetMinInStack(struct stack *p)
{
	if(p->top_min==-1)
	{
		printf("空栈\n");
		return -9999;
	}
	else
	{
		return p->min[p->top_min];
	}
}
int main(void)
{
	struct stack *stack_min;
	int popValue;
	int minInStack;
	stack_min=(struct stack *)malloc(sizeof(struct stack *));
	InitStack(stack_min);
	PushStack(stack_min,10);
    PushStack(stack_min,1);
	PushStack(stack_min,101);
	PushStack(stack_min,-1);
	PushStack(stack_min,-2);
	PushStack(stack_min,-3);

	popValue=PopStack(stack_min);
	minInStack=GetMinInStack(stack_min);
	printf("出栈%d  栈中最小值%d\n",popValue,minInStack);

	popValue=PopStack(stack_min);
	minInStack=GetMinInStack(stack_min);
	printf("出栈%d  栈中最小值%d\n",popValue,minInStack);

	popValue=PopStack(stack_min);
	minInStack=GetMinInStack(stack_min);
	printf("出栈%d  栈中最小值%d\n",popValue,minInStack);
	getchar();
    return 0;
}

时间: 2024-09-28 17:48:49

在栈中增加min函数的相关文章

【StiReport】在设计器中增加自定义函数

1.创建一个自定义函数 namespace Winform { public class methos { public static string 小数转换成中文(decimal 小数) { return "321"; } } } 2.将函数注册到StiReport中 StiFunctions.AddFunction("自定义函数", "小数转换成中文", "小数转换成中文", "小数转换成中文", ty

笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素

出题:把二元查找树转变成排序的双向链表.输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向: 分析: 递归的思路,当前节点需要进行的处理,并使用递归调用和返回值将子问题链接起来: 首先明白二元查找树的特性,变成有序双向链表后当前根节点的左节点为其原来左子树的最右节点,右节点为其原来右子树的最左节点:因此策略就是针对当前根节点索引的子树,首先判断其为上层节点的右子树还是左子树,从而决定返回最右还是最右节点:然后再递归处理当前根节点的

九章算法面试题50 队列上实现Min函数

九章算法官网-原文网址 http://www.jiuzhang.com/problem/50/ 题目 ?在<九章算法面试题23 栈上实现Min函数>中,我们介绍了在栈上实现一个O(1)的Min方法.那么,如何在队列上实现一个Min方法? 要求,队列除了支持基本的Push(x) Pop()的方法以外,还需要支持Min方法,返回当前队列中的最小元素.每个方法的均摊复杂度为O(1) 解答 在九章面试题49<用栈实现队列>和面试题23<栈上实现Min函数>中,我们讲解到了如何用

011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)

实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值. push,pop和min函数的时间复杂度都为O(1). 看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否? 如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值. 可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办. 既然只用一个变量没法解决这个问题,那我们就增加变量.如果说每个结点除了保存当前的 值, 另外再保存一个从该结点到栈底的

实现一个栈,并且实现一个min函数用来找当前栈中最小的元素

题目描述:实现一个栈,并且实现一个min函数用来找当前栈中最小的元素 分析:要找到栈中最小的元素,需要借助一个辅助栈,来存放当前栈中最小的元素. 入栈的时候,第一个入栈的元素,也给辅助栈入栈,此后每次入栈的元素先与辅助栈的栈顶元素比较,如果小于或等于辅助栈的栈顶元素,则同时将该元素给辅助栈入栈. 如下图所示: 出栈的时候,如果栈顶元素与辅助栈栈顶的元素相等,则同时对辅助栈进行出栈操作 如下图所示: 这样就可以保证,辅助栈中的栈顶元素始终是当前栈中最小的元素了 代码如下: #include<ios

剑指offer20:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

1 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 2. 思路和方法 利用辅助栈来存储现有栈的最小值.在入栈和出栈的时候将现有栈和最小值栈进行比较.入栈时,若新值比最小值栈的栈顶还小,则将该值同时push到最小值栈:出栈时,若现有栈的栈顶和最小值栈栈顶一致,则同时出栈,否则,仅仅现有栈pop:通过这一操作,最小值栈的栈顶将永远是现有栈元素中的最下值. 3 C++核心代码 1 class Solution { 2 public: 3

【算法题目】包含min函数的栈

题目来源:<剑指offer>面试题21 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push以及pop的时间复杂度都是O(1). 分析:假设用于存储主要数据的栈称为数据栈.我们增加一个辅助栈,它的栈顶元素永远是当前数据栈中元素的最小值.当插入元素时,如果插入的元素比辅助栈栈顶还小,那么就往辅助栈压入这个数据作为当前数据栈新的最小值.如果大的话,再次压入辅助栈的栈顶元素,表明来了一个新元素后,最小值没有变换. //m_data是数据栈,m_

算法题23 带min函数的栈

题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数.在该栈中,调用 min.push 及 pop 的时间复杂度都是 0(1) 分析 要在O(1)的时间获取最小元素,需要将这个最小元素保存下来.但只用一个变量去保存最小的元素可以吗?如果在使用栈的过程中将这个最小元素pop出去了,因为栈中的元素是无序的,则无法在O(1)的时间找到第二小的值做为最小元素. 因此我们要么要将栈中的元素在push的过程中排序,要么需记录栈的每一个位置所对应的的最小值,具体做法是借助一个辅助栈

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(