第二道题目如下:
那么栈是属于一种先入后出的线性表数据结构,这里的主要要求是求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();
}
下面的是运行结果: