修改栈,使得能O(1)的求出栈里最大的数和最小的数

来源:互联网 发布:网络日语教师招聘 编辑:程序博客网 时间:2024/05/16 04:43

思路:

首先,建立3个栈,dataStack , minStack , maxStack 。

这里只说如何求出最小元素。

1.push() 将k插入dataStack中,如果minStack中没有数,则加入k;如果k比minStack.top()小,也加入k;否则对minStack不做操作。

2.pop() 如果两个栈的头元素相同,则一起取出;若不相同,则只取出dataStack。

3.min() 最小元素为minStack.top()

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <iostream>#include <stack>using namespace std;class STack{private:    stack<int> dataStack;    stack<int> minStack;    stack<int> maxStack;public:    void push(int k)    {        dataStack.push(k);        if(minStack.empty())        {            minStack.push(k);        }        if(maxStack.empty())            maxStack.push(k);        else if(k<minStack.top())        {            minStack.push(k);        }        else if(k>maxStack.top())            maxStack.push(k);    }    void pop()    {        if(dataStack.top() == minStack.top())        {            minStack.pop();        }        if(dataStack.top() == maxStack.top())            maxStack.pop();        dataStack.pop();    }    int min()    {        return minStack.top();    }    int max()    {        return maxStack.top();    }};int main(){    STack s;    s.push(4);    s.push(3);    s.push(7);    s.push(5);    s.push(6);    s.push(10);    s.push(1);    for(int i=0;i<7;i++)    {         printf("min:%d\n",s.min());         printf("max:%d\n",s.max());         s.pop();    }    return 0;}


0 0
原创粉丝点击