定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、
push 以及 pop 的时间复杂度都是 O(1)。
源码:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h”
#include<assert.h>
#include<iomanip>
#include <vector>
#include<iostream>
using namespace std;
template<typename T>
class MinClass
{
public:
MinClass()
{
}
T Min();
T Pop();
void Push(T );
public:
vector<T> vec;
vector<int> minIndex;
};
template<typename T> T MinClass<T>::Min()
{
assert(minIndex.size() > 0);
assert(vec.size() > 0);
return vec[minIndex.back()];
}
template<typename T> T MinClass<T>::Pop()
{
assert(vec.size() > 0);
minIndex.pop_back();
int m = vec.back();
vec.pop_back();
return m;
}
template<typename T> void MinClass<T>::Push(T data)
{
if (vec.size()==0)
{
vec.push_back(data);
minIndex.push_back(0);
}
else
{
if (data>(int)(vec[minIndex[minIndex.back()]]))
{
minIndex.push_back(minIndex[minIndex.size() – 1]);
}
else
{
minIndex.push_back(minIndex.size());
}
vec.push_back(data);
}
}
void PrintList(MinClass<int> M)
{
for (int i = 0; i < M.vec.size(); i++)
{
cout<<setw(2) << M.vec[i] << ” “;
}
}
int main(void)
{
MinClass<int> MinTemp;
while (true)
{
int m;
cout << “请输入命令(1:min,2:pop,3:push):” << endl;
cin >> m;
switch (m)
{
case 1:
{
int data = MinTemp.Min();
cout << endl << “最小值为 ” << data << endl;
PrintList(MinTemp);
cout << endl;
break;
}
case 2: //PoP
{
int data = MinTemp.Pop();
cout << endl << “POP为 ” << data << endl;
PrintList(MinTemp);
cout << endl;
break;
}
case 3: //Push
{
int data;
cout << “请输入数值:” << endl;
cin >> data;
MinTemp.Push(data);
cout << endl << “Push后 ” << endl;
PrintList(MinTemp);
cout << endl;
break;
}
default:
break;
}
}
return 0;
}