编程之美:队列中的最大最小值

#include "iostream"
#include "memory.h"
#include "stdio.h"
#include "limits.h"
typedef int Type;
const int MAXN=15;
const int MIN=INT_MIN;
class stack
{
public:
    stack()
    {
        stacktop=-1;
        maxItemIndex=-1;
    }
    void push(Type x)
    {
        ++stacktop;
        if (stacktop>=MAXN)
            ;
        else
        {
            stackItem[stacktop]=x;
            if (x>maxItem())
            {
                link2NextMaxItem[stacktop]=maxItemIndex;
                maxItemIndex=stacktop;
            }
            else link2NextMaxItem[stacktop]=-1;
        }
    }
    Type pop()
    {
        if (stacktop<0)
            ;
        else
        {
            Type x=stackItem[stacktop];
            if (maxItemIndex==stacktop)
            {
                maxItemIndex=link2NextMaxItem[stacktop];
            }
            --stacktop;
            return x;
        }
    }
    Type maxItem()
    {
        if (maxItemIndex>=0)
        {
            return stackItem[maxItemIndex];
        }
        else return MIN;
    }
    Type empty()
    {
        return stacktop==-1;
    }
private:
    Type stackItem[MAXN];
    Type link2NextMaxItem[MAXN];
    Type maxItemIndex;
    Type stacktop;

};
class Queue
{
public:
    inline Type max(Type x,Type y)
    {
        return x>y?x:y;
    }
    Type deque()
    {
        if (stackOut.empty())
        {
            while (!stackIn.empty())
                stackOut.push(stackIn.pop());
        }
        return stackOut.pop();
    }
    void inque(Type x)
    {
        stackIn.push(x);
    }
    Type maxItem()
    {
        return max(stackIn.maxItem(),stackOut.maxItem());
    }
private:
    stack stackIn,stackOut;
};
int main(int argc, char const *argv[])
{
    Queue q;
    q.inque(3);
    printf("%d\n", q.maxItem());

    q.inque(2);
    printf("%d\n", q.maxItem());
    q.deque();

    q.inque(1);
    printf("%d\n", q.maxItem());

    stack s;
    s.push(3);
    printf("%d\n", s.maxItem());

    s.push(2);
    printf("%d\n", s.maxItem());
    s.pop();

    s.push(1);
    printf("%d\n", s.maxItem());

    return 0;
}
push(Type x)
    {
        ++stacktop;
        if (stacktop>=MAXN)
            ;
        else
        {
            stackItem[stacktop]=x;
            if (x>maxItem())
            {
                link2NextMaxItem[stacktop]=maxItemIndex;
                maxItemIndex=stacktop;
            }
            else link2NextMaxItem[stacktop]=-1;
        }
    }
    Type pop()
    {
        if (stacktop<0)
            ;
        else
        {
            Type x=stackItem[stacktop];
            if (maxItemIndex==stacktop)
            {
                maxItemIndex=link2NextMaxItem[stacktop];
            }
            --stacktop;
            return x;
        }
    }
    Type maxItem()
    {
        if (maxItemIndex>=0)
        {
            return stackItem[maxItemIndex];
        }
        else return MIN;
    }
    Type empty()
    {
        return stacktop==-1;
    }
private:
    Type stackItem[MAXN];
    Type link2NextMaxItem[MAXN];
    Type maxItemIndex;
    Type stacktop;

};
class Queue
{
public:
    inline Type max(Type x,Type y)
    {
        return x>y?x:y;
    }
    Type deque()
    {
        if (stackOut.empty())
        {
            while (!stackIn.empty())
                stackOut.push(stackIn.pop());
        }
        return stackOut.pop();
    }
    void inque(Type x)
    {
        stackIn.push(x);
    }
    Type maxItem()
    {
        return max(stackIn.maxItem(),stackOut.maxItem());
    }
private:
    stack stackIn,stackOut;
};
int main(int argc, char const *argv[])
{
    Queue q;
    q.inque(3);
    printf("%d\n", q.maxItem());

    q.inque(2);
    printf("%d\n", q.maxItem());
    q.deque();

    q.inque(1);
    printf("%d\n", q.maxItem());

    stack s;
    s.push(3);
    printf("%d\n", s.maxItem());

    s.push(2);
    printf("%d\n", s.maxItem());
    s.pop();

    s.push(1);
    printf("%d\n", s.maxItem());

    return 0;
}

代码与思路见原书236页

简单的来说:求队列中的最大值过程由两部分组成

1.求取栈的最大值

2.用栈模拟队列

时间: 2024-08-10 02:10:51

编程之美:队列中的最大最小值的相关文章

Java 编程之美:并发极速赛车平台出租编程高级篇

借用 Java 并发极速赛车平台出租haozbbs.comQ1446595067 编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了. 相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的. 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步: 而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].

编程之美2.17之数组循环移位

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N),且只允许使用两个附加变量. 什么意思呢,就是说如果输入序列为:abcd1234,右移2位即变为34abcd12.唯一的要求就是使用两个附加变量. 其实这道题编程珠玑上面也出现过,书中给出的一种符合题意的解法是巧妙地进行翻转.以把abcd1234右移4位为例: 第一步:翻转1234,abcd1234---->abcd4321 第二步:翻转abcd,abcd4321---->dcba4321 第三

编程之美2.3: 寻找发帖水王

题目:传说,Tango有一大"水王",他不但喜欢发帖,还会回复其他ID发的帖子,发帖数目超过帖子总数的一半,如果你有一个当前论坛上所有帖子的列表,其中帖子作者的ID也在表中,你能快速找到这个传说中的Tango水王吗? 解题思路:由于水王的发帖数目超过一半,当每次删除两个不同ID的帖子时,水王占得帖子数目仍然大于剩下帖子的一半,重复整个过程,将ID列表中的ID总数降低,转化为更小的问题,从而得到最后水王的ID. #include <iostream> #include <

编程之美2.13 子数组最大乘积

问题描述: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度. 解法: 1.暴力解法------O(n^2) 2.前后缀法------O(n) 3.统计法--------O(n) 具体思路和代码: 1.暴力解法: 思路:利用两层循环,依次删掉一个,其余的做乘法,计算出最大的. 代码: 1 int s1(int A[], int n) 2 { 3 int s = 1; 4 int max; 5 for(int i = 1;

编程之美2.1 求二进制中1的个数

最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表,位运算,数组,hash表应用等等. 由于最近事情也忙得差不多了,我重新写了一遍编程之美中的算法,在这里记录下来,以便以后阅读方便. 第一道题从2.1写起,这道题目难度不是很大,首先,给出这个题目的函数声明: /*2.1 求二进制中1的个数*/ int DutCountOf1InBin_1(unsig

编程之美2.17 数组循环移位

问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法------O(KN) 思路:循环K次,每次移动一位 代码: 1 //右移 2 void s1(int A[], int n, int k) 3 { 4 k = k % n; 5 for(int i = 0; i < k; i++) 6 { 7 int t = A[n-1]; 8 for(int j = n-

编程之美leetcode之编辑距离

Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a character b) Delete a char

编程之美3.7 队列中最大值问题

      这道题目的意思是,有一个队列,它里面会存储一些数值,现在,要求你需要在 O(1) 的时间内返回这个队列中最大的那个值.       这道题目的和栈中最大值最小值问题是一样的解法,都是需要一个辅助的东西,对于这道题目,我需要的是一个辅助队列.       由于是需要找到最大值,我的做法是,如果辅助队列为空,那么,当数据入队列的时候就需要同时放入队列和辅助队列中:如果辅助队列不为空,但是入队列的那个元素比辅助队列的队首元素大或者相等,那么,也是需要同时放入两个队列中:其他情况,只需要放入