自己动手“敲”微软100题系列二

第二道题目如下:


那么栈是属于一种先入后出的线性表数据结构,这里的主要要求是求min、push以及pop的时间复杂度要求为O(1),虽然我没有上过专门的数据结构课程,

但是也知道不能去用for类似的循环去遍历整个栈,那么查找最小时,一个办法是在每次压栈时,把最小元素存起来,比如压入一个元素a,而之前栈的元素最小为min,那么

压入之后的最小元素肯定是a和min中的最小值,此时存入a的同时还需存储两者最小值。

参考了文档:微软面试100题系列by_July。  (以后不再赘述)

下面上代码:


//参考:http://www.cnblogs.com/caidaxia/archive/2011/10/14/2212369.html

#include <iostream>
#include <iomanip>
using namespace std;

//栈中一个数据单元,包含当前数据,已经栈在此时的最小数据
struct MinStackData
{
	int currentData;
	int minData;
};

//整个栈数据结构体
struct MinStack
{
	MinStackData *data;
	int m_nSize;
	int top;
};

//初始化栈,引用传递
void initMinStack(MinStack &minStack,int size) 
{
	
	minStack.data=(MinStackData* )malloc(sizeof(MinStackData)*size);
	minStack.m_nSize=size;
	minStack.top=0;
}

//压入元素
bool push(MinStack *minStack,int val)
{
//	int minVal;
	if (minStack->top == minStack->m_nSize)
	{
		cout << "size overflow" << endl;
		return false;
	}
	minStack->data[minStack->top].currentData=val;
	
	if (minStack->top ==0)
	{		
		minStack->data[minStack->top].minData=val;
	}else {
		minStack->data[minStack->top].minData=( val < minStack->data[minStack->top-1].minData ) ? val: minStack->data[minStack->top-1].minData ;
	}
	minStack->top++;	
	return true;
}

//弹出一个元素
int pop(MinStack *minStack)
{
	if (minStack->top == 0)
	{
		cout << "error: stack empty" << endl;
		return -1;
	}
	
	return minStack->data[--minStack->top].currentData;
}

//返回最小元素
int min(MinStack *minStack)
{
	if (minStack->top == 0)
	{
		cout << "error: stack empty" << endl;
		return -1;
	}
	return minStack->data[minStack->top-1].minData;
}


void main()
{
	MinStack minStack;
	initMinStack(minStack,100);

	//向栈中随机添加5个元素
	for (int i=0;i<5;i++)
	{
		int temp=rand()%10;
	if (push(&minStack,temp))
	{
		cout <<"push a value:  " << temp<< endl;
	}			
	 cout <<"the min value is :  " << min(&minStack) << endl;
	}

	cout <<"*****************" << endl;

	//每次出栈一个元素,测试找出的最小元素,
	for (int i=minStack.top;i>0;i--)
	{
		
		cout <<"the min value is :" << min(&minStack) << endl;
		if (pop(&minStack))
		{
			cout <<"pop a value :" <<minStack.data[minStack.top].currentData << endl;
		}
			
	}
	//让控制台程序停留下	
	getchar();
}

下面的是运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值