码迷,mamicode.com
首页 > 其他好文 > 详细

1057. Stack (30)

时间:2014-09-15 19:07:19      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   div   sp   

/*to solve the problem ,i think we can use stack to maintain the numbers,
and list to keep it sorted,which is very important to find the Median number.
*/
#include<stack>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;

int main()
{
    int n;
    stack<int> stak;
    string command;
    int a;
    cin>>n;
    while (n--)
    {
        cin>>command;
        if (command == "Push")
        {
            cin>>a;
            stak.push(a);
        }
        if (command == "Pop")
        {
            if (stak.empty())
            {
                cout<<"Invalid"<<endl;
            }
            else
            {
                cout<<stak.top()<<endl;
                stak.pop();
            }
        }
        if (command == "PeekMedian")
        {
            if (stak.empty())
            {
                cout<<"Invalid"<<endl;
                continue;
            }
            vector<int> ls;
            while (!stak.empty())
            {
                ls.push_back(stak.top());
                stak.pop();
            }
            //use the unsorted vector to push_back the stack
            for (int i = ls.size()-1; i >=0 ; i—)
            {
                stak.push(ls[i]);
            }
            sort(ls.begin(),ls.end());
            cout<<ls[ls.size()%2 == 0 ? ls.size()/2-1:(ls.size()+1)/2-1]<<endl;
        }
    }
}

At first,i think i could use a temporary stack not only to keep the stack in order but alse to find

the median one . And it is proofed that it is feasible but not effcient ,as everytime we need

to sort the stack as long as we want to use the command “PeekMedian”.

the Time complexity is O(n * log n). then i searched the web. I find someone use the set,

which is virtually a balanced binary tree.so we could reduced the time complexity down to

O(log n). Then i rebuild the code according to this suggestion.

#include <iostream>
#include <set>
#include <algorithm>
#include <stack>
#include <cstring>

using namespace std;

multiset<int> small, big;
stack<int> s;
int mid;

void adjust()
{
    if (small.size() > big.size() + 1)
    {
        auto it = small.end();
        --it;
        big.insert(*it);
        small.erase(it);
    }
    else if (small.size() < big.size())
    {
        auto it = big.begin();
        small.insert(*it);
        big.erase(it);
    }
    if (s.size() > 0)
    {
        auto it = small.end();
        --it;
        mid = *it;
    }
}

int main()
{
    int n;
    char op[15];
    int top, Key;
    scanf("%d", &n);
    while (n--)
    {
        scanf("%s", op);
        if (op[1] == o)
        {
            if (s.size() == 0)
                printf("Invalid\n");
            else
            {
                top = s.top();
                s.pop();
                printf("%d\n", top);
                if (mid >= top)
                {
                    auto it = small.find(top);
                    small.erase(it);
                }
                else
                {
                    auto it = big.find(top);
                    big.erase(it);
                }
                adjust();
            }
        }
        else if (op[1] == u)
        {
            scanf("%d", &Key);
            if (s.size() == 0)
            {
                small.insert(Key);
                mid = Key;
            }
            else if (Key <= mid)
                small.insert(Key);
            else
                big.insert(Key);
            s.push(Key);
            adjust();
        }
        else if (op[1] == e)
        {
            if (s.size() == 0)
                printf("Invalid\n");
            else
                printf("%d\n", mid);
        }
    }
}

1057. Stack (30)

标签:style   blog   color   io   os   ar   for   div   sp   

原文地址:http://www.cnblogs.com/maverick-fu/p/3973240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!