0、最小栈介绍
最小栈:最小栈是一个栈,有push()、pop()、top()等相同的函数外,还有一个主要方法get_min函数用来获取当前栈中的最小元素。
get_min()函数:可以通过O(1)时间获取当前栈的最小值。
1、算法问题
问题:实现一个栈,该栈带有出栈函数pop()、入栈函数push()、取最小元素get_min()3个方法。保证3个方法的时间复杂度为O(1)。
2、思路讲解
详细步骤:
- 设原有的栈A,此时建立一个额外的栈B用于存储当前进栈的最小值,用于辅助栈A获得最小值。
栈A:
栈B:
- 当第一个元素进入栈A时,让第一个元素也进入栈B,因为此时栈A的最小元素就是第一个进栈元素。
栈A:
5 |
---|
栈B:
5 |
---|
- 接下来,当每一个元素进入栈A时,比较新元素和栈A最小元素的大小(即比较栈B的栈顶元素),如果小于栈A的最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A的最小元素。
进栈A前:
5 | 6 | 7 |
---|
进栈B前:
5 |
---|
进栈A后:
5 | 6 | 7 | 4 |
---|
进栈B后:
5 | 4 |
---|
- 当元素出栈时,如果出栈元素是栈A当前的最小元素,则让栈B的栈顶元素也出栈。此时栈B栈顶所指向的是栈A的下一个最小元素。
出栈A:
5 | 6 | 7 |
---|
出栈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");
}
运行截图: