昨天晚上完成第一个问题,今天来完成第二个问题。依然是网上搜索的到思路,觉得其实现比较优雅,就自己写了一遍,把思路整理一下!
有人说用链表来实现链栈,我个人觉得太过于麻烦,还是数组直接,简单!
解决这道题的思路在于:用空间换时间!很关键,很直白,但并不是很个人都能很灵活的运用!比如我就不能!
代码实现也很简单,定义一个结构体,结构体中两个等大的数组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);
- }
唉!该好好学学数学了,把大脑练灵活点!