您的位置:首页 > Web前端

剑指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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: