2. 求带min的stack

这个问题的难点是如何使得得到栈中的最小值只需要时间O(1)的复杂度,既然时间从O(N)降到了O(1),一般情况下空间势必会多出来O(n)来赢得时间开始自己的思路是给stack多加一个属性minValue,后来发现在变化莫测的出栈入栈的变化中,这仅仅O(1)的空间的增加无法正确的求出stack的最小值;

其实这个问题只需要在栈的数据结构上略动下手脚就可以,问题带来最大的变化是出栈后最小值如何取,我们只要保证每一次出栈后最小值也能恢复到栈顶元素入栈前的状态就可以, 所以我们在平时的仅仅表示数值的属性elem下加一个属性min,以便记录当前元素作为栈顶时的最小值,这样我们就可以取得每个时刻的最小值。

在程序方面出了点小问题开始,其实是老问题:在对定义的数据结构进行修改时要添加“&”;

代码如下:

/*
 * -*- coding: utf-8 -*-
/*
 * stack.cpp
 *
 *  Created on: 2014年4月21日
 *      Author: szk
 *      todo: 算法设计第2题——设计带有min的stack,要求push,pop和getMin操作的时间复杂度均为O(1).
 */
#include <iostream>
#define STACK_MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define ERROR -32767
typedef struct stackNode{
	int data;
	int min;
};
typedef struct stack{
	stackNode *node;
	int top;
};
using namespace std;
int isEmpty(stack s)
{
	if(s.top == 0)
		return TRUE;
	else
		return FALSE;
}
int isFull(stack s)
{
	if(s.top == STACK_MAXSIZE)
		return TRUE;
	else
		return FALSE;
}
void push(stack &s, int e)
{
	int pos = s.top;
	if(isEmpty(s))
	{
		s.node[pos].data = e;
		s.node[pos].min = e;
//		s.minValue = e;
	}
	else if(!isFull(s))
	{
		s.node[pos].data = e;
		if(e < s.node[pos - 1].min)
		{
			s.node[pos].min = e;
//			s.minValue = e;
		}
		else
			s.node[pos].min = s.node[pos - 1].min;
	}
	else
	{
		cout << "The stack is already full!!!" << endl;
		return;
	}
	++s.top;
}
int pop(stack &s)
{
	int pos = s.top;
	if(isEmpty(s))
	{
		cout << "The stack is empty!!!" << endl;
	}
	else
	{
		--s.top;
		return s.node[pos].data;
	}
	return ERROR;
}
int getMin(stack s)
{
	if(!isEmpty(s))
		return s.node[s.top].min;
	cout << "The stack is empty!!!" << endl;
	return ERROR;
}
int main()
{
	stack s;
	s.top = 0;
	push(s, 1);
	push(s, 3);
	push(s, 2);
	cout << s.node[--s.top].min << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值