题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
分析:
看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思
路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍一看这样思
路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
所以在写程序时,要加一个辅助的数组,记录在data数组中最小值的依次位置,这样在data数组出栈是,最小值数组也能相应的做出判断!
#include <iostream>
using namespace std;
const int max_size = 30 ;
template<class T>
class Stack
{
private:
int top; //记录栈定位置
T data[max_size]; //记录栈数据
int min_data[max_size]; //记录最小位置数组
int min_pos; //记录最小位置的数组位置
T min; //当前最小值
public:
Stack();
~Stack();
void push(T n);
void pop();
T fucmin();
};
template<class T>
Stack<T>::Stack()
{
top = -1 ;
min_pos = -1 ;
}
template<class T>
Stack<T>::~Stack()
{}
template<class T>
void Stack<T>::push(T n)
{
if(top == max_size-1) //判断是否栈满
cout<<"stack is full";
else
{
top++;
if (top == 0) //判断是否是第一个位置
{
min = n ;
min_pos = 0 ;
min_data[min_pos] = top ;
}
else if (min>n)
{
min_pos++;
min = n ;
min_data[min_pos] = top ;
}
data[top] = n ; //入栈
}
}
template<class T>
void Stack<T>::pop()
{
if(top == -1)
cout<<"stack is emoty";
else
{
if(data[top] == min)
{
min_pos--;
min = data[min_data[min_pos]];
}
top--;
}
}
template<class T>
T Stack<T>::fucmin()
{
return min ;
}
int main()
{
int min ;
Stack<int> test;
test.push(4);
test.push(5);
test.push(7);
test.push(2);
min = test.fucmin();
test.push(1);
min = test.fucmin();
test.pop();
min = test.fucmin();
test.pop();
min = test.fucmin();
test.pop();
min = test.fucmin();
test.pop();
min = test.fucmin();
system("pause");
return 0 ;
}