栈表中获取最小值,时间复杂度为O(1)

来源:互联网 发布:bartender vb 编辑:程序博客网 时间:2024/05/16 03:24

       近期复习数据结构,看到网上有一道算法题,该题目曾经是google的一道面试题,国内的互联网公司也纷纷效仿。我也顺便复习之。

       题目内容为:对现在的stack(栈)数据结构进行改进,加一个min()功能,使之能在常数,即o(1),时间内给出栈中的最小值。可对push()和pop()函数进行修改,但要求其时间复杂度都只能是o(1)。

        解题思路:1.由于题目要求的是一个栈,所以想要通过栈内元素进行排序,这个是不可行的。

          2.由于存在每次的push和pop操作。所以,通过在入口设置最小值,然后不断更新最小值的方式也是不可取的。因为,pop一次之后就失效了。

                    解决方案是通过辅助栈表,由于题目只要求获得栈内剩余元素中的最小值,并没有要求每次pop出来的是最小值,我自己就陷入了这个思维。所以我们可以通过辅助栈,即数据栈每push一次,辅助栈也push一次,push的值为数据栈中的当前最小值。经过如此,最后,辅助栈每次push就均可获得数据栈中的最小值。

         下面提供相关的示例代码:

   

////  main.cpp//  栈最小值////#include <iostream>#include <assert.h>#include <deque>using namespace std;#define MAX_SIZE 100template<typename T>//考虑到数据的多样性,采用模版class DataStack {    T dataList[MAX_SIZE];    T minList[MAX_SIZE];    int top;//栈顶标记    public:    DataStack(){top = -1;}    void Push(T &value);    T Pop();    T GetMin();};template<typename T>void DataStack<T>::Push(T &value){    top++;    dataList[top] = value;    if (top == 0) {        minList[top] = value;    }    else{        if (value < minList[top-1]) {            minList[top] = value;        }        else{            minList[top] = minList[top - 1];        }    }};template<typename T>T DataStack<T>::Pop(){    minList[top] = 0;    return dataList[top--];}template <typename T>T DataStack<T>::GetMin(){    return minList[top];}int main(int argc, const char * argv[]) {    // insert code here...    DataStack<int> dataList;    int temp=9;    dataList.Push(temp);    temp = 8;    dataList.Push(temp);    temp = 13;    dataList.Push(temp);    temp = 35;    dataList.Push(temp);        cout<<dataList.GetMin()<<endl;    dataList.Pop();    cout<<dataList.GetMin()<<endl;    dataList.Pop();    cout<<dataList.GetMin()<<endl;    dataList.Pop();    cout<<dataList.GetMin()<<endl;    dataList.Pop();      return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老师上课发现学生课上自慰怎么办 生完孩子腿粗屁股大怎么办 产后42天检查子宫偏大怎么办 崇拜瑜伽老师喜欢上他了怎么办 练瑜伽下不了腰贴不住腿怎么办 吃母乳宝宝吸的奶头疼怎么办 孩子吃奶把奶头咬破了怎么办 奶头边上让孩子咬破了吃奶疼怎么办 腰部受过伤久坐缓解腰疼怎么办 小孩八个月了还在软得很怎么办 产后第三天乳房胀痛有硬块怎么办 怀孕七个多月了胎位不正怎么办 怀孕6个月梅毒1:4怎么办 怀孕了胃酸胃涨吐酸水怎么办 怀孕了胃酸胃胀吐酸水怎么办 练瑜伽大腿外侧扭筋了怎么办 膝盖运动时疼痛睡觉不疼怎么办 在农村里床上老是有小蜈蚣该怎么办 瑜伽垫晒太阳后散发的甲醛怎么办 杯子盖上的皮垫子掉了漏水怎么办 20个月宝宝天天晚上不睡觉怎么办 八个月大小孩天天晚上不睡觉怎么办 如果开了光的貔貅不要了要怎么办 刚岀生的婴儿长得太快怎么办 呼市去办牌照时没有牌照怎么办 宾馆发现隐藏的摄像头怎么办报警吗 拍拍贷律师函寄到家里了怎么办 欠了拍拍贷本息一万多了怎么办 把人偷小孩的人贩子打死了怎么办 怀孕3个月没有胎心怎么办 社保局打印关系转移信封之后怎么办 长裙变装外出被发现了怎么办 超变陀螺怎么绳子拉不出来怎么办 梦幻诛仙传说时间得不到东西怎么办 夹在强势母亲和强势老公中间怎么办 工作调动校长总拖着不盖章怎么办 宝贝在妈妈肚子里发育慢怎么办 领导安排你负责一次讲座你怎么办 雷蛇北海巨妖耳机有回音怎么办 手机直播声卡有杂音有回音怎么办 大班见到陌生人入园怎么办安全教案