﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-csolay-随笔分类-C/C++</title><link>http://www.cppblog.com/csolay/category/17963.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Oct 2011 18:08:43 GMT</lastBuildDate><pubDate>Fri, 21 Oct 2011 18:08:43 GMT</pubDate><ttl>60</ttl><item><title>扩展堆栈（stack） O(1) 时间访问栈中最小值（或最大值）</title><link>http://www.cppblog.com/csolay/archive/2011/10/22/158858.html</link><dc:creator>csolay</dc:creator><author>csolay</author><pubDate>Fri, 21 Oct 2011 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/csolay/archive/2011/10/22/158858.html</guid><wfw:comment>http://www.cppblog.com/csolay/comments/158858.html</wfw:comment><comments>http://www.cppblog.com/csolay/archive/2011/10/22/158858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/csolay/comments/commentRss/158858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csolay/services/trackbacks/158858.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><strong>问题描述：</strong>扩展stack的实现，完成正常的push，pop操作，新增访问最小（或最大）元素的接口Min（），使得push，pop，Min的时间复杂度都是O(1)。</span></p>
<p><span style="font-size: 10pt"><strong>问题分析：</strong>拿到这道题，我们最先的思考往往是，设计一个算法从栈中拿到最小值，所以开始考虑任何可以用来实现该功能的排序和查找算法。假设栈中有n个元素，一切排序和查找都不可能实现O(1)的时间复杂度找到最小值。</span></p>
<p><span style="font-size: 10pt">再看题目，既然是扩展stack的实现，stack是一种数据结构，一种数据的组织方式，扩展它，也就允许我们对其数据组织方式和存储内容作一些改变吧。所以我们就有了下面的思路：</span></p>
<p><span style="font-size: 10pt">把当前最小值存起来，并且在进行push和pop操作的时维护它。维护要求如下：</span></p>
<p><span style="font-size: 10pt">1、如果有比当前最小值大的元素入栈，当前最小值不变</span></p>
<p><span style="font-size: 10pt">2、如果有比当前最小值小（或等于）的元素入栈，当前最小值变为新加入元素</span></p>
<p><span style="font-size: 10pt">3、如果有比当前最小值大的元素出栈，当前最小值不变（注意：弹出的操作时，一定不可能弹出比当前最小值还小的元素，也就是说如果你弹出了一个比当前最小值还小的元素，就证明你的那个当前最小值不是当前最小值）</span></p>
<p><span style="font-size: 10pt">4、如果有和当前最小值的元素相同出栈，当前最小值变为当前当前最小值入栈之前那个最小值，当前最小值退出。</span></p>
<p><span style="font-size: 10pt">综上，我们发现一个规律：对于最小值而言，如果有更小的数入栈，需要将其保存为当前最小，如果当前最小数出栈，当前最小数变成当前最小数入栈之前那个最小数，所以，对于最小数而言也具有先进后出，后进先出的特点，只是并不是每次push和pop操作都牵涉到最小数的进出。所以我们考虑用双栈来实现，一个栈用来存放数据，满足栈数据结构原始要求，一个栈用来存放最小值，在每次push和pop操作执行时，按照上面的规则维护最小值栈。</span></p><img src ="http://www.cppblog.com/csolay/aggbug/158858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csolay/" target="_blank">csolay</a> 2011-10-22 00:20 <a href="http://www.cppblog.com/csolay/archive/2011/10/22/158858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>