返回当前栈内最小元素
设计一个栈,包含传统的push,pop,top方法。此外,再设计一个getMin函数,用于返回栈内最小的元素。
思想:存储普通的数据元素用eStack,存储最小值用栈minStack。当eStack存一个元素时,minStack记录当前最小值,当eStack弹出一个元素时,minStack弹出栈顶元素。eStack和minStack中的top,同时进行操作(入栈,出栈,获取栈顶元素)
代码:
typedef int SElemType;
#define SMaxSize 100;//普通栈
typedef struct{SElemType data[SMaxSize];int top;
}SqStack;//本题要用的栈
typedef struct{SqStack eStack,minStack;
}EMStack; //初始化
void initEMstack(MEStck &s){s.eStack.top=-1;s.minStack.top=-1;
} // 获取栈顶元素
bool top(MEStack &s,SElemType &e,SElemType &min){if(s.eStack.top==-1||s.minStack.top==-1){return false;} e=s.minStack.data[s.eStack.top];min=s.minStack.data[s.mixStack.top];return true;
}
//入栈
bool push(MEStack &s,SElemType e){//栈满if(s.eStack.top==SMaxStack-1||s.mimStack.top=SMaxSize-1){return false;} //元素入eStack栈 s.eStack.data[++s.eStack.top]=e;//最小值入栈if(s.minStack.top==-1){s.minStack.data[++s.mixStack.top]=e;} else{SElemType mTop,eTop;top(s,eTop,mTop); s.minStack.data[++s.mixStack.top]=min(eTop,mTop);}return true;
} //出栈
bool pop(MEStack &s,SElemType &e,SElemType &min){if(s.eStack.top==-1||s.minStack.top==-1){return false;}e=s.minStack.data[s.eStack.top--];min=s.minStack.data[s.mixStack.top--];return true;
} //返回栈内最小值
bool getMin(MEStack &s,SElemType &min) {if(s.minStack.top==-1){return false;}min=s.minStack.data[s.mixStack.top];return true;
}
时间复杂度O(1);空间复杂度O(n)(空间换时间)