今天做了一下WPS的笔试题 ,遇到了一道关于栈的题,觉得挺有意思的,就写篇博客分享一下吧~~
题目要求 :要求实现栈的数据结构,在该类型中实现一个能够得到栈的最大元素的max函数,在该栈中,调用max,push,pop的时间复杂度是O(1).
解题思路 :我们首先会想到的大概是,找最大元素不就排个序,直接取栈顶的元素不就好了吗。可是这时,我们就把这个入栈的顺序修改了。这并不是我们想要的。在不改变入栈顺序的情况下,我们只能用一个辅助栈来解决这一类问题。
此时,我们可以将最大的元素放到这个辅助栈中,取辅助栈的栈顶元素就ok了。问题来了?
如何给辅助栈中放最大元素???
这里分为以下几种情况:
我们先往数据栈中放元素,当辅助栈为空时,直接将数据栈中的元素放入辅助栈中 当辅助栈中有数据时,我们需要比较将要入栈的数据是否大于当前辅助栈中的数据,如果大于则继续往辅助栈中放数据,否则放入当前辅助栈中的数据(这里用的比较巧妙,是为了寻找次大的数据,当pop出数据后,仍然可以找到次大的数据 )
最终解题思路 :
代码实现 :
由于自己考虑到了string类的特殊情况,里边还使用了仿函数的形式,实现了简单的模板类。
#include<iostream>
using namespace std ;
#include<stack>
#include<assert.h>
#include<string> template <class T>
struct Less
{bool operator ()(const T& left,const T& right){return left < right;}
};template <class T>
struct Greater
{bool operator ()(const T& left,const T& right){return left >= right;}
};template <class T,class Compare>
class StackWithMax
{
public :void Push(const T& data);void Pop();T& MaxValue();private :stack <T> value_st;stack <T> max_st;
};template <class T,class Compare>
void StackWithMax<T,Compare>::Push(const T& data)
{value_st.push(data);if (max_st.size() == 0 || Compare()(data,max_st.top()))max_st.push(data);else max_st.push(max_st.top());
}template <class T,class Compare>
void StackWithMax<T,Compare>::Pop()
{assert(value_st.size() >= 0 && max_st.size() >= 0 );max_st.pop();value_st.pop();
}
template <class T,class Compare>
T& StackWithMax<T,Compare>::MaxValue()
{assert(value_st.size() >= 0 && max_st.size() >= 0 );return max_st.top();
}
测试代码 :
int main()
{StackWithMax<int,Greater<int>> st st .Push (3 )st .Push (4 )st .Push (2 )st .Push (1 )st .Push (4 )cout<<st .MaxValue ()<<endlst .Pop ()cout<<st .MaxValue ()<<endlStackWithMax<string,Greater<string>> st1st1.Push ("aaa" )st1.Push ("bbb" )st1.Push ("ccc" )st1.Push ("fff" )st1.Push ("eee" )cout<<st1.MaxValue ()<<endlst1.Pop ()cout<<st1.MaxValue ()<<endlreturn 0
}
运行结果 :