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

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

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

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

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

 

  1. /* 
  2.  * Problem_2.cpp 
  3.  * 设计包含 min 函数的栈 
  4.  *  Created on: 2012-8-28 
  5.  *      Author: Administrator 
  6.  */ 
  7. #include<stdio.h> 
  8. #include<string.h> 
  9. #define M 100 
  10. struct Stack{ 
  11.     int data[M]; 
  12.     int mIndex[M]; 
  13.     int top; 
  14.     Stack(){ 
  15.         top=-1; 
  16.         memset(mIndex,-1,sizeof(mIndex)); 
  17.     } 
  18. }; 
  19. Stack s; 
  20. bool push(int value){ 
  21.     if(s.top>=M) 
  22.         return false
  23.     s.data[++s.top]=value; 
  24.     if(s.top==0){ 
  25.         s.mIndex[s.top]=0; 
  26.     }else if(value<s.data[s.mIndex[s.top-1]]){ 
  27.         s.mIndex[s.top]=s.top; 
  28.     }else
  29.         s.mIndex[s.top]=s.mIndex[s.top-1]; 
  30.     } 
  31.     return true
  32. bool pop(int &data){ 
  33.     if(s.top<0) 
  34.         return false
  35.     s.mIndex[s.top]=-1; 
  36.     data=s.data[s.top]; 
  37.     s.top--; 
  38.     return true
  39. bool min(int &m){ 
  40.     if(s.top<0) 
  41.         return false
  42.     m= s.data[s.mIndex[s.top]]; 
  43.     return true
  44. int main(){ 
  45.     push(5); 
  46.     push(2); 
  47.     push(4); 
  48.     push(1); 
  49. //  pop();pop(); 
  50.     int m; 
  51.     min(m); 
  52.     printf("%d",m); 

唉!该好好学学数学了,把大脑练灵活点!