题目:定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。
解法:用两个vector实现该功能,一个用来存储栈中的实际数据,一个用来存储每次入栈后当时最小的元素的下标。
首先复习一下vector的一些函数
// 定义一个vector
std::vector<int> c;
// 可以使用的功能
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.erase(pos) 删除pos位置的数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front() 传回第一个数据。
c.back() 传回最后一个数据
c.insert(pos,elem) 在pos位置插入一个elem拷贝
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num) 重新设置该容器的大小
c.size() 回容器中实际数据的个数。
c.begin() 返回指向容器第一个元素的迭代器
c.end() 返回指向容器最后一个元素的迭代器
代码如下:
- // minstack.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include<iostream>
- //用vector需要包含的头文件
- #include<vector>
- //assert()需要包含的头文件
- #include<assert.h>
- using namespace std;
- //注意用模版
- template<class T> class MinStack
- {
- public:
- MinStack(){};//注意写构造和析构函数
- ~MinStack(){};
- T& top();
- void push(const T value);
- void pop();
- T& min();
- private:
- vector<T> stackdata;
- vector<T> minstackdata;
- };
- template<class T> T& MinStack<T>::top()
- {
- return stackdata.back();
- }
- template<class T> void MinStack<T>::push(const T value)
- {
- stackdata.push_back(value);
- if(minstackdata.size()==0)
- minstackdata.push_back(0);
- else
- {
- if(value<stackdata[minstackdata.back()])
- minstackdata.push_back(stackdata.size()-1);
- else
- minstackdata.push_back(minstackdata.back());
- }
- }
- template<class T> void MinStack<T>::pop()
- {
- //注意assert
- assert(stackdata.size()>0);
- assert(minstackdata.size()>0);
- stackdata.pop_back();
- minstackdata.pop_back();
- }
- template<class T> T& MinStack<T>::min()
- { assert(stackdata.size()>0);
- assert(minstackdata.size()>0);
- return stackdata[minstackdata.back()];
- }
- int main(int argc, char* argv[])
- {
- MinStack<int> a;//注意类模版的类型显示写
- a.push(3);
- cout<<a.min()<<endl;
- a.push(4);
- cout<<a.min()<<endl;
- a.push(2);
- cout<<a.min()<<endl;
- a.push(1);
- cout<<a.min()<<endl;
- cout<<a.top()<<endl;
- a.pop();
- return 0;
- }