博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer系列14:包含min函数的栈
阅读量:5211 次
发布时间:2019-06-14

本文共 1889 字,大约阅读时间需要 6 分钟。

看到这道题,我的第一个思路是在push进栈的时候直接比较一下该数和前一个数的大小关系,直接把最小的数始终放在栈顶。可是这样的话,这个结构就不是一个栈了,因为它不能满足先进后出的原则。

答案的做法是加一个辅助栈,直接在辅助栈里村小的数,如果来小的数字就更新,如果不来小的数字就不更新。如果加一个辅助栈那这个题就简单了。

注意一个问题,这个数据栈和辅助栈是压栈一起压入,弹出的时候一起弹出。但是压入的时候,辅助栈不一定压入新的值,但一定是最小的值。因此及时在新的一轮弹出以后,这个辅助栈也始终保持数据栈中的最小元素在他的顶端。

我发现很多这种类似的题目都要建立一个辅助的数据结构一存储临时需要的结点信息,不一定非要一直想着怎么在原来的数据结构上做变化。特别是栈这种数据结构,内部的结构不好轻易变化的。

具体代码如下:

1 #include
2 #include
3 #include
4 using namespace std; 5 class Solution { 6 public: 7 stack
st; 8 stack
aux; 9 void push(int value) {10 st.push(value);11 if (aux.size() == 0)12 {13 14 aux.push(value);15 }16 else17 {18 if (value > aux.top())//来了一个较大的值,给辅助栈放上一个值19 {20 aux.push(aux.top());21 }22 else//来的值小,放入辅助栈中23 aux.push(value);24 }25 26 }27 void pop() {28 if (st.size() == 0)29 return;30 st.pop(); //记得弹出的时候两个栈都要弹出31 aux.pop();32 }33 int top() {34 if (st.size() == 0)35 return 0;36 return st.top();37 }38 int min() {39 if (st.size() == 0)40 return 0;41 return aux.top();42 }43 };44 int main()45 {46 Solution so;47 so.push(4);48 so.push(3);49 so.push(9);50 so.push(5);51 so.push(2);52 so.push(7);53 cout << so.min() << endl;54 so.pop();55 so.pop();56 cout << so.min() << endl;57 return 0;58 }

如果加一个辅助栈,就很简单了。栈也是很常考的知识点。有一个问题,我看到很多人做这个题都用了this指针来做,但是我不明白用this指针有什么好处?

我在vs中尝试了这两句,也就是上面代码的20行,我试着调试进入这两句看看有什么不同。

 1 //aux.push(value); 2 this->aux.push(value);  

结果我step into进去,这两个语句的效果完全一样。而且我发现,push操作其实是调用了push_back实现的。

转载于:https://www.cnblogs.com/neverland0718/p/11012770.html

你可能感兴趣的文章
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
查看>>
最大公约数求解
查看>>
网卡bond技术
查看>>
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
机器学习之支持向量机(一):支持向量机的公式推导
查看>>
对【SQL SERVER 分布式事务解决方案】的心得补充
查看>>
UNIX基础知识之输入和输出
查看>>
Diango路由映射FBV和CBV
查看>>
Android Studio配置指南总结
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>
python之装饰器
查看>>
对称加密和非对称加密
查看>>
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
图像处理中双线性插值
查看>>
RobHess的SIFT代码解析之RANSAC
查看>>
bzoj3944:Sum
查看>>
UVA 10859 - Placing Lampposts 树形DP、取双优值
查看>>
03 线程池
查看>>
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>
java中内部类的讲解
查看>>