【编程之美】3.7 队列取最大值操作问题 ☆

之前写过栈的,以为队列的也一样,结果一点都不一样。写了好久啊。

因为栈是后进先出,先进去的数字不会影响后面的数字;而队列是先进先出,后进去的会受先进入的数字的影响。

比如: (先)  1 9 3 8 4 (后)  这样的序列

栈存储        1 9               就可以了,因为9弹出后,自然 1 就是最大的

队列则不行,如果按上面存储9弹出后 剩下 3 8 4,8是最大的,没有存储。

 

我的方法,保存一个max的队列

入队列时: 如果新值比 max的最前面的元素大,那么把max清空,压入新值。  因为这个元素比所有值大,并且比所有值都晚弹出。

如果不满足上面条件,但是新值比数据队列的最后一个元素大或等于,把新值压入max队列。因为队列只剩下新值上一个元素和新值时,该新值就是最大的数字。

出队列时:如果弹出的数字和max队列最前面的数字一样大,弹出max中的元素

获得最大元素:获得max的最前面的元素。

#include <iostream>
#include <queue>
using namespace std;


class My_Queue
{
public:
    My_Queue(){};
    void EnQueue(int v)
    {
        if(max.empty())
        {
            max.push(v);
        }
        else
        {
            if(v > max.front())
            {
                while(!max.empty())
                {
                    max.pop();
                }
                max.push(v);
            }
            else if(v >= data.back())
            {
                max.push(v);
            }
        }
        data.push(v);
    }

    int DeQueue()
    {
        if(data.empty())
        {
            printf("error");
            return 0;
        }

        if(!max.empty() && data.front() == max.front())
        {
            max.pop();
        }
        int del = data.front();
        data.pop();
        return del;
    }

    int MaxElement()
    {
        if(max.empty())
        {
            printf("no data\n");
            return 0;
        }
        return max.front();
    }

    queue<int> data;
    queue<int> max;
};



int main()
{
    My_Queue q;
    q.EnQueue(1);
    q.EnQueue(5);
    q.EnQueue(9);
    q.EnQueue(3);
    q.EnQueue(8);
    q.EnQueue(4);
    q.EnQueue(8);
    q.EnQueue(11);

    for(int i = 0; i < 8; i++)
    {
        printf("max:%d ", q.MaxElement());
        printf("del:%d\n", q.DeQueue());
    }

    return 0;
}

 

书上答案:

用两个栈A, B来构造队列,因为栈取最大可以O(1),利用栈使得队列取最大也是O(1)

数据入队列时:都压入栈B

数据出队列时: 若A为空,则把B的数据依次弹出给A,再弹出A的最后一个元素  (两次后进先出就变成了先进先出)

                     若A不空,直接弹出A的最后一个元素

取最大值: 取栈A 和 栈B 最大值里 更大的那一个

转载于:https://www.cnblogs.com/dplearning/p/4114395.html

基于SSM框架的智能家政保洁预约系统,是一个旨在提高家政保洁服务预约效率和管理水平的平台。该系统通过集成现代信息技术,为家政公司、家政服务人员和消费者提供了一个便捷的在线预约和管理系统。 系统的主要功能包括: 1. **用户管理**:允许消费者注册、登录,并管理他们的个人资料和预约历史。 2. **家政人员管理**:家政服务人员可以注册并更新自己的个人信息、服务类别和服务时间。 3. **服务预约**:消费者可以浏览不同的家政服务选项,选择合适的服务人员,并在线预约服务。 4. **订单管理**:系统支持订单的创建、跟踪和管理,包括订单的确认、完成和评价。 5. **评价系统**:消费者可以在家政服务完成后对服务进行评价,帮助提高服务质量和透明度。 6. **后台管理**:管理员可以管理用户、家政人员信息、服务类别、预约订单以及处理用户反馈。 系统采用Java语言开发,使用MySQL数据库进行数据存储,通过B/S架构实现用户与服务的在线交互。系统设计考虑了不同用户角色的需求,包括管理员、家政服务人员和普通用户,每个角色都有相应的权限和功能。此外,系统还采用了软件组件化、精化体系结构、分离逻辑和数据等方法,以便于未来的系统升级和维护。 智能家政保洁预约系统通过提供一个集中的平台,不仅方便了消费者的预约和管理,也为家政服务人员提供了一个展示和推广自己服务的机会。同时,系统的后台管理功能为家政公司提供了强大的数据支持和决策辅助,有助于提高服务质量和管理效率。该系统的设计与实现,标志着家政保洁服务向现代化和网络化的转型,为管理决策和控制提供保障,是行业发展中的重要里程碑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值