实现一个栈,该栈带有出栈函数pop()、入栈函数push()、取最小元素get_min()3个方法。保证时间复杂度为O(1)

0、最小栈介绍

最小栈:最小栈是一个栈,有push()、pop()、top()等相同的函数外,还有一个主要方法get_min函数用来获取当前栈中的最小元素。

get_min()函数:可以通过O(1)时间获取当前栈的最小值。

1、算法问题

问题:实现一个栈,该栈带有出栈函数pop()、入栈函数push()、取最小元素get_min()3个方法。保证3个方法的时间复杂度为O(1)。

2、思路讲解

详细步骤

  1. 设原有的栈A,此时建立一个额外的栈B用于存储当前进栈的最小值,用于辅助栈A获得最小值。

栈A

栈B:

  1. 当第一个元素进入栈A时,让第一个元素也进入栈B,因为此时栈A的最小元素就是第一个进栈元素。

栈A:

5

栈B

5
  1. 接下来,当每一个元素进入栈A时,比较新元素和栈A最小元素的大小(即比较栈B的栈顶元素),如果小于栈A的最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A的最小元素。

进栈A前

567

进栈B前

5

进栈A后

5674

进栈B后

54
  1. 当元素出栈时,如果出栈元素是栈A当前的最小元素,则让栈B的栈顶元素也出栈。此时栈B栈顶所指向的是栈A的下一个最小元素。

出栈A:

567

出栈B

5
    • 当调用get_min()时,返回栈顶的值即可;

    • 当调用push()时,继续执行步骤3;

    • 当调用pop()时,继续执行步骤4;

    • 当调用top()时,返回栈A的栈顶值

3、完整代码

代码编译器:VS2019

其中运用了系统自带的STL栈操作,关于这部分详解请看: 栈与队列基础操作(含STL)从函数具体实现到STL运用

//主要代码:    建立一个MinimumStack类进行封装    MinimumStack.h   
#pragma once
#include <iostream>
#include <stack>

using namespace std;

class MinimumStack{
public:
	void push(int value);
	void pop();
	int top();
	int get_min();
private:
	stack<int>  A, B;
};
// 类具体实现     MinimumStack.cpp 
#include "MinimumStack.h"

void MinimumStack::push(int value) {
	if (A.empty()) {     //判断栈A是否为空,为空则不进行比较最小值,直接进栈
		A.push(value);
		B.push(value);
	}
	else {
		if (value > B.top()) {
			A.push(value);
		}
		else {
			A.push(value);
			B.push(value);
		}
	}

}

void MinimumStack::pop() {
	if (A.top() == B.top()) {    //如果弹栈元素是当前栈A的最小元素,则栈B也要弹栈
		A.pop();
		B.pop();
	}
	else {
		A.pop();
	}
}

int MinimumStack::top() {
	return A.top();
}

int MinimumStack::get_min() {
	return B.top();
}
//示例演示   main.cpp
#include<iostream>
#include "MinimumStack.h"

using namespace std;

int main() {
	MinimumStack minimumStack;
	minimumStack.push(5);
	minimumStack.push(6);
	minimumStack.push(7);
	minimumStack.push(4);
	cout << " get_man() = " << minimumStack.get_min() << endl;
	minimumStack.push(3);
	cout << " get_man() = " << minimumStack.get_min() << endl;
	minimumStack.pop();
	cout << " get_man() = " << minimumStack.get_min() << endl;
	cout << " top() = " << minimumStack.top() << endl;
	minimumStack.pop();
	cout << " get_man() = " << minimumStack.get_min() << endl;
	cout << " top() =  " << minimumStack.top() << endl;
	minimumStack.pop();
	cout << " get_man() = " << minimumStack.get_min() << endl;
	cout << " top() = " << minimumStack.top() << endl;
	minimumStack.pop();
	minimumStack.pop();
	minimumStack.push(10);
	cout << " get_man() = " << minimumStack.get_min() << endl;
	system("pause");
}

运行截图:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值