剑指offer-算法题练习:part22 包含min函数的栈
2016-10-21 12:13
459 查看
包含min函数的栈
热度指数:8683时间限制:1秒空间限制:32768K
本题知识点: 栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
<解析1>
我们可以设计两个栈:StackDate和StackMin,一个就是普通的栈,另外一个存储push进来的最小值。
1)push操作:
每次压入的数据value都push进StackDate中(StackData.push(value););然后判断StackMin是否为空,如果为空那也把value同步压入 StackMin里(if(StackMin.empty()) StackMin.push(value););如果不为空,就先比较value和StackMin中栈顶元素的大小,如果value较大,那就不压入StackMin里,否则
就同步压入StackMin里(else if(value<=StackMin.top()) StackMin.push(value);)。如上图所示。
2)pop操作:
先将StackDate中取出的数据value与StackMin的栈顶元素比较,因为对应push操作,value不可能小于 StackMin中的栈顶元素,最多是相等。如果相等,那么StackMin中也取出数据,同时返回value,(if(StackData.top()==StackMin.top()) StackMin.pop();)否则只是返回value就可以了(StackData.pop();)。
code1——结合图,很容易理解代码的思路
class Solution {
public:
stack<int> StackData, StackMin;
void push(int value) {
StackData.push(value);
if(StackMin.empty()){ StackMin.push(value);}//if
else if(value<=StackMin.top()){ StackMin.push(value);}//else if
}
void pop() {
if(StackData.top()==StackMin.top())
StackMin.pop();
StackData.pop();
}
int top() {
return StackData.top();
}
int min() {
return StackMin.top();
}
};
<解析2>
应用一个辅助栈,思路和解析1差不多
1)压栈:如果value<=stack2.top(),则stack2.push(value);
2)出栈:如果stack1.top()==stack2.top(),则stack2.pop(),否则stack1.pop()。
code2——与code1类似的
class Solution {
public:
stack<int> stack1,stack2;
void push(int value) {
stack1.push(value);
if(stack2.empty())
{
stack2.push(value);
}//if
else if(value<=stack2.top()){
stack2.push(value);
}//else if
}
void pop() {
if(stack1.top()==stack2.top()) stack2.pop();
stack1.pop();
}
int top() {
return stack1.top();
}
int min() {
return stack2.top();
}
};
<解析3>
first 指元素
second 指当前最小值
注意:宏定义在编译时是直接替换,所以宏定义时一定要用括号括起来,否则编译运行时容易出错
#define MIN(a, b) ((a) < (b) ? (a) : (b))
class Solution {
stack<pair<int, int> > s;
public:
void push(int value) {
s.push(pair<int, int>(value, s.empty() ? value : MIN(value, min())));
}
void pop() {
s.pop();
}
int top() {
return s.top().first;
}
int min() {
return s.top().second;
}
};
热度指数:8683时间限制:1秒空间限制:32768K
本题知识点: 栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
<解析1>
我们可以设计两个栈:StackDate和StackMin,一个就是普通的栈,另外一个存储push进来的最小值。
1)push操作:
每次压入的数据value都push进StackDate中(StackData.push(value););然后判断StackMin是否为空,如果为空那也把value同步压入 StackMin里(if(StackMin.empty()) StackMin.push(value););如果不为空,就先比较value和StackMin中栈顶元素的大小,如果value较大,那就不压入StackMin里,否则
就同步压入StackMin里(else if(value<=StackMin.top()) StackMin.push(value);)。如上图所示。
2)pop操作:
先将StackDate中取出的数据value与StackMin的栈顶元素比较,因为对应push操作,value不可能小于 StackMin中的栈顶元素,最多是相等。如果相等,那么StackMin中也取出数据,同时返回value,(if(StackData.top()==StackMin.top()) StackMin.pop();)否则只是返回value就可以了(StackData.pop();)。
code1——结合图,很容易理解代码的思路
class Solution {
public:
stack<int> StackData, StackMin;
void push(int value) {
StackData.push(value);
if(StackMin.empty()){ StackMin.push(value);}//if
else if(value<=StackMin.top()){ StackMin.push(value);}//else if
}
void pop() {
if(StackData.top()==StackMin.top())
StackMin.pop();
StackData.pop();
}
int top() {
return StackData.top();
}
int min() {
return StackMin.top();
}
};
<解析2>
应用一个辅助栈,思路和解析1差不多
1)压栈:如果value<=stack2.top(),则stack2.push(value);
2)出栈:如果stack1.top()==stack2.top(),则stack2.pop(),否则stack1.pop()。
code2——与code1类似的
class Solution {
public:
stack<int> stack1,stack2;
void push(int value) {
stack1.push(value);
if(stack2.empty())
{
stack2.push(value);
}//if
else if(value<=stack2.top()){
stack2.push(value);
}//else if
}
void pop() {
if(stack1.top()==stack2.top()) stack2.pop();
stack1.pop();
}
int top() {
return stack1.top();
}
int min() {
return stack2.top();
}
};
<解析3>
first 指元素
second 指当前最小值
注意:宏定义在编译时是直接替换,所以宏定义时一定要用括号括起来,否则编译运行时容易出错
#define MIN(a, b) ((a) < (b) ? (a) : (b))
class Solution {
stack<pair<int, int> > s;
public:
void push(int value) {
s.push(pair<int, int>(value, s.empty() ? value : MIN(value, min())));
}
void pop() {
s.pop();
}
int top() {
return s.top().first;
}
int min() {
return s.top().second;
}
};
相关文章推荐
- 剑指offer-算法题练习:part12 数值的整数次方
- 剑指offer-算法题练习:part18 合并两个排序的链表
- 剑指offer-算法题练习:part14 c++多线程—2个线程并发售票系统-烽火众智
- 剑指offer(22):包含min函数的栈
- 剑指offer-算法题练习:part6 旋转数组的最小数字
- 剑指offer-算法题练习:part4 重建二叉树
- 剑指offer-算法题练习:part8 跳台阶-斐波那契数列问题
- 剑指offer-算法题练习:part17 反转链表
- 剑指offer-算法题练习:part15 调整数组顺序使奇数位于偶数前面
- 剑指offer-算法题练习:part21 顺时针打印矩阵
- 剑指offer-算法题练习:part20 二叉树的镜像
- 剑指offer-算法题练习:part16 链表中倒数第k个结点
- 剑指offer-算法题练习:part11 二进制中1的个数
- 剑指offer-算法题练习:part7 斐波那契数列-斐波那契数列问题
- 剑指offer-算法题练习:part9 变态跳台阶-斐波那契数列问题
- 剑指offer 面试题21:包含min函数的栈
- 【剑指offer】13,包含min函数的栈
- 剑指offer_面试题21_包含min函数的栈
- 剑指offer - 包含min函数的栈
- 剑指OFFER之包含min函数的栈(九度OJ1522)