设计包含min函数的栈(源码)

news/2024/7/4 0:53:56

采用两个双端队列实现,一个存数据,一个是辅助栈,存第一个栈的最小元素的地址,实现技巧在于辅助栈存放的是第一个栈的最小元素的地址,难度在于使用模板实现。

#include <deque>
#include <assert.h>
#include <iostream>

using namespace std;

template <typename T>class CStackWithMin
{
public:
 CStackWithMin(void){}
 virtual ~CStackWithMin(void){}

 T& top(void);
 const T&top(void)const;

 void push(const T& value);
 void pop(void);

 const T& min(void) const;

 const T& size(void) const;

private:
 deque<T> m_data;//the element of the stack
 deque<size_t> m_minIndex; //the index of minimum elements
};

template<typename T> T& CStackWithMin<T>::top()
{
 return m_data.back();
}

template<typename T> const T& CStackWithMin<T>::top() const
{
 return m_data.back();
}

template<typename T> void CStackWithMin<T>::push(const T& value)
{
 m_data.push_back(value);

 if (m_minIndex.size()==0)
 {
  m_minIndex.push_back(0);
 }
 else
 {
  if(value<m_data[m_minIndex.back()])
   m_minIndex.push_back(m_data.size()-1);
  else
   m_minIndex.push_back(m_minIndex.back());
 }
}

template<typename T> void CStackWithMin<T>::pop()
{
 m_data.pop_back();

 m_minIndex.pop_back();
}

template<typename T>const T& CStackWithMin<T>::min()const
{
 assert(m_data.size()>0);
 assert(m_minIndex.size()>0);

 return m_data[m_minIndex.back()];
}

template<typename T>const T& CStackWithMin<T>::size() const
{
 assert(m_data.size()>0);
 assert(m_minIndex.size()>0);

 return m_data.size();
}

int main()
{
 CStackWithMin<int> cs;

 cs.push(3);
 cs.push(4);
 cs.push(2);
 cs.push(1);
 cs.push(5);
 cs.push(6);
 cs.push(0);
 cout<<"cs.size() = "<<cs.size()<<endl;
 int len=cs.size();
 for (int i=0; i<len; i++)
 {
  cout<<"cs.min() = "<<cs.min()<<endl;
  cout<<"cs.top() = "<<cs.top()<<endl;
  cs.pop();
 }

 return 0;
}

转载于:https://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/10/1796472.html


http://www.niftyadmin.cn/n/581952.html

相关文章

CoreData在Swift 3.0中的一点改变

在Swift 2.0中我们需要从core data中query结果的时候使用的是如下方式: func findAnimals() {let request = NSFetchRequest(entityName:”Animal")do {guard let searchResults = try context.executeFetchRequest(request) as? [Animal] else {print("Results w…

《Leaflet 基础知识点》- 图层添加与删除(两种方式)

方式一 通过 L.Map 对象的方法添加或删除 L.Layer 对象。点此进入API 方式二 通过 L.Layer 对象的方法添加或删除 L.Map 对象中。点此进入API

Xcode8.x使用CoreData模型出现类被非法重定义的解决办法

这个问题在Xcode7.x中貌似没碰到过。不过在Xcode8.x中&#xff0c;在使用可视界面创建CoreData模型后再使用Editor->Create NSManagedObject Subclass之后有时会发现生成的数据对象类被重复定义的编译错误&#xff01; 这是因为在Xcode8.0中包含了一个自动生成NSManagedObj…

Tomcat安装为服务service.bat设置

TOMCAT/bin/serice.bat install/unstall将TOMCAT安装成windows服务成功,但是启动的时候报错:提示“...特定代码0”service.bat加入set JAVA_HOMEC:\Program Files\Java\jre启动服务时出错&#xff0c;提示“...特定代码0”解决办法将JDK中BIN文件夹下的 msvcr71.dll 这个文件复…

给必填项加红色

$("form :input.required").each(function(){var $required $("<em>*</em>");$(this).parent().append($required); });

对GitHub的CoreData项目改造及完善

GitHub&CoreData(以下简称GC)项目是一个可以实时从GitHub的swift‘s Project里抓取更新的App。 其中用到了第三方的json库SwiftyJSON,以及用来保存,枚举以及修改数据的NSFetchedResultsController对象。 但是该项目在实际运行时用NSFetchedResultsController分组显示…

Swift 3.0:String初始化器Encoding不能为nil的解决

以后会写一系列Swift 3.0中的小变化的博文,内容短小,因为我遇到这种问题就马上写下来,并不会刻意积累一大堆再一起写出来.如果大家有Swift 3.0使用上的问题欢迎提问. 这个问题发生在之前可以执行的代码中: if let plays = try? String(contentsOfFile: path, usedEncoding: …

《Leaflet 基础知识点》- 图层循环(小技巧)

点此进入API 使用场景&#xff0c;如关闭全部打开的popup框 // 关闭全部Popup map.eachLayer((layer) > {layer.closePopup(); });