O1的时间复杂度内实现栈的Push、Pop和min

思路:使用双栈,两个栈是同步关系。主栈是普通栈,用来实现栈的基本操作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;
}

运行结果如下:

在这里插入图片描述
谢谢小可爱的鼓励与支持

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值