您的位置:首页 > 职场人生

微软面试题系列(二):设计包含 min 函数的栈

2012-08-28 12:14 260 查看
昨天晚上完成第一个问题,今天来完成第二个问题。依然是网上搜索的到思路,觉得其实现比较优雅,就自己写了一遍,把思路整理一下!

有人说用链表来实现链栈,我个人觉得太过于麻烦,还是数组直接,简单!

解决这道题的思路在于:用空间换时间!很关键,很直白,但并不是很个人都能很灵活的运用!比如我就不能!

代码实现也很简单,定义一个结构体,结构体中两个等大的数组data[M],mIndex[M],一个存储数据,另一个存储最小值的下标,

mIndex[i]表示[0,i]区间中最小值的下标。思路明白了代码就很好写了,下面是一种我认为很严谨的实现方式:当然是别人写的,我copy了一遍!还是贴上来吧,以供参考:

/*
* Problem_2.cpp
* 设计包含 min 函数的栈
*  Created on: 2012-8-28
*      Author: Administrator
*/
#include<stdio.h>
#include<string.h>
#define M 100
struct Stack{
int data[M];
int mIndex[M];
int top;
Stack(){
top=-1;
memset(mIndex,-1,sizeof(mIndex));
}
};
Stack s;
bool push(int value){
if(s.top>=M)
return false;
s.data[++s.top]=value;
if(s.top==0){
s.mIndex[s.top]=0;
}else if(value<s.data[s.mIndex[s.top-1]]){
s.mIndex[s.top]=s.top;
}else{
s.mIndex[s.top]=s.mIndex[s.top-1];
}
return true;
}
bool pop(int &data){
if(s.top<0)
return false;
s.mIndex[s.top]=-1;
data=s.data[s.top];
s.top--;
return true;
}
bool min(int &m){
if(s.top<0)
return false;
m= s.data[s.mIndex[s.top]];
return true;
}
int main(){
push(5);
push(2);
push(4);
push(1);
//  pop();pop();
int m;
min(m);
printf("%d",m);
}

唉!该好好学学数学了,把大脑练灵活点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息