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

来源:互联网 发布:软件设计师2016下半年 编辑:程序博客网 时间:2024/06/06 01:33

第二道题目如下:


那么栈是属于一种先入后出的线性表数据结构,这里的主要要求是求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();}

下面的是运行结果:



0 0
原创粉丝点击