**
以下为C++版本
**
设计一个栈,支持如下操作,
push(x), top(), pop(),
getMin(): 返回栈内最小元素
这些操作的算法复杂度需要是常数级,O(1)
1个变量MIN无法完成记录栈中所有状态下的最小值。
栈的每个状态,都需要一个变量记录最小值。
#include<stdio.h>
#include<stack>
class MinStack
{
private:
std::stack<int> _data;
std::stack<int> _min;
public:
MinStack(){}
void push(int x)
{
_data.push(x);
if (_min.empty())
{
_min.push(x);
}
else
{
if (x >= _min.top())
{
x = _min.top();
}
_min.push(x);
}
}
void pop()
{
_data.pop();
_min.pop();
}
int top()
{
return _data.top();
}
int getMin()
{
return _min.top();
}
};
int main()
{
MinStack minstack;
minstack.push(-2);
printf("top = [%d]\n", minstack.top());
printf("min=[%d]\n\n", minstack.getMin());
minstack.push(0);
printf("top = [%d]\n", minstack.top());
printf("min=[%d]\n\n", minstack.getMin());
minstack.push(-5);
printf("top = [%d]\n", minstack.top());
printf("min=[%d]\n\n", minstack.getMin());
minstack.pop();
printf("top = [%d]\n", minstack.top());
printf("min=[%d]\n\n", minstack.getMin());
return 0;
}
运行结果如下:
top = [-2]
min=[-2]
top = [0]
min=[-2]
top = [-5]
min=[-5]
top = [0]
min=[-2]
**
以下为Python版本
**
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))
# -*-coding:utf-8 -*-
class Solution:
def __init__(self):
self.stack = []
self.minValue = []
def push(self, node):
self.stack.append(node)
if self.minValue:
if self.minValue[-1] > node:
self.minValue.append(node)
else:
self.minValue.append(self.minValue[-1])
else:
self.minValue.append(node)
def pop(self):
if not self.stack:
return None
self.minValue.pop()
return self.stack.pop()
def top(self):
if self.stack[-1]:
return None
return self.stack[-1]
def min(self):
if not self.minValue:
return None
return self.minValue[-1]
if __name__ == '__main__':
s = Solution()
s.push(1)
s.push(2)
s.push(3)
s.push(-3)
s.push(-4)
s.push(-5)
print(s.min())
s.pop()
print(s.min())
s.pop()
print(s.min())
运行结果为:
-5
-4
-3