设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin();
class MinStack {
private:
stack<int> minStack;
stack<int> dataStack;
public:
MinStack() {
}
void push(int val) {
dataStack.push(val);
if(minStack.empty()||val<=minStack.top())
{
minStack.push(val);
}
}
void pop() {
if(!dataStack.empty()){
if(dataStack.top()==minStack.top()){
minStack.pop();
}
dataStack.pop();//无理由pop
}
}
int top() {
if(!dataStack.empty()){
return dataStack.top();
}
return INT_MIN;
}
int getMin() {
if(!minStack.empty()){
return minStack.top();
}
return INT_MIN;//处理
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
这个题目整体很简单,特别容易想到的是维护一个主栈(数据栈)dataStack,一个最小栈minStack,每一步push,pop,同等维护minStack,top 正常返回,minSize,仿作minStack.pop就可以了。
这里用到了对top的异常处理,用的是INT_MIN其实用false也行的,今天看到了这个东西所以用了一下,
C++中边界宏的使用:
-
初始化:当需要为整数变量设置一个初始值时,可以使用
INT_MIN
。例如,初始化一个最小值变量,用于记录遇到的整数最小值。 -
比较:在算法和数据结构中,需要检查某个值是否等于
INT_MIN
。例如,在实现一个求最小值的函数时,可以将初始最小值设置为INT_MIN
。 -
边界条件:在处理边界条件时。例如,当实现某些数学函数(如
abs
)时,需要考虑输入值为INT_MIN
的情况。
除了INT_MIN
之外,C++标准库还提供了其他类似的宏,表示其他整数类型的最小值:
LONG_MIN
:表示long
类型可能的最小值。LLONG_MIN
:表示long long
类型可能的最小值。SHRT_MIN
:表示short
类型可能的最小值。UCHAR_MAX
:表示unsigned char
类型可能的最大值。UINT_MAX
:表示unsigned int
类型可能的最大值。ULONG_MAX
:表示unsigned long
类型可能的最大值。ULLONG_MAX
:表示unsigned long long
类型可能的最大值。USHRT_MAX
:表示unsigned short
类型可能的最大值。
在编程和算法中,异常情况和边界情况是两种需要注意的特殊场景
异常情况(Exceptional Cases):
异常情况通常是由于输入数据不合法或不符合预期而导致的。这些情况可能导致程序出错、崩溃或不正确的行为。在编写代码时,应当尽量确保程序能够正确处理异常情况,避免程序崩溃或产生不可预料的结果。一些常见的异常情况包括:
- 空指针访问:试图访问一个空指针所指向的内存地址。
- 数组越界:访问数组的一个不存在的索引。
- 除以零:进行除法运算时,除数为零。
- 非法输入:用户输入的数据不符合预期的格式或范围。
边界情况(Boundary Cases):
边界情况是指程序执行过程中,输入数据或操作处于临界状态的情况。边界情况可能导致程序行为的不确定性,因此需要特别注意。边界情况通常与数据结构的特性、算法的逻辑以及循环终止条件等相关。一些常见的边界情况包括:
- 栈为空时尝试弹出元素。
- 队列满时尝试插入元素。
- 数组的第一个元素和最后一个元素,在遍历或操作数组时需要特别关注。
- 循环的起始和结束条件,需要确保循环能正确地开始和结束。
- 分治算法的递归基(base case),需要确保递归过程能够正确地终止。
处理异常情况和边界情况的方法:
- 对于异常情况,可以采用输入验证、异常处理机制(如C++中的try-catch语句)等方法来确保程序能够安全地应对异常情况。
- 对于边界情况,可以通过仔细分析算法和数据结构的性质,设计合适的边界条件检查和处理逻辑,以确保程序的正确性。