思路:使用双栈,两个栈是同步关系。主栈是普通栈,用来实现栈的基本操作Push和Pop;辅助栈用来记录同步的最小值min,例如元素x进栈, 则辅助栈stack_ min[top++]=(x<min) ?x:min;即在每次Push中,都将当前最小元素放到stack_ min的栈顶。在主栈中Pop .最小元素y时,stack_ min 栈中相同位置的最小元素y也会随着top–而出栈。因此stack_ min的栈顶元素必然是y之前入栈的最小元素。本题是典型的以空间换时间的算法。
下面是c++实现的版本
#include<iostream>
using namespace std;
#define maxsize 100
int n;
//声明一个栈并且初始化
int stack[maxsize];
int top=-1;
//定义一个辅助栈
int stackMin[maxsize];
int minTop=-1;
//定义一个最小值
int minVal=1000;
void push(int x){
stack[++top]=x;
stackMin[++minTop]=x<minVal?x:minVal;
minVal=stackMin[minTop];
}
void pop(){
top--;
minTop--;
minVal=stackMin[minTop];
}
int getMin(){
return minVal;
}
int main(){
push(12);
push(9);
cout<<"压栈12 9之后的最小值"<<getMin()<<endl;
pop();
push(2132);
push(1);
push(2);
cout<<"压栈12 9,出栈,压栈2132,1,2之后的最小值"<<getMin()<<endl;
}
运行结果如下:
谢谢小可爱的鼓励与支持