IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【算法数据结构】仓库日志 -> 正文阅读

[数据结构与算法]【算法数据结构】仓库日志

题目描述

? 某仓库购入新的货物(每次购入的货物均不同)并将一部分老货物发出,这个过程会有软件对数据以日志形式保存,规则如下:

? 该日志记录了两类操作:第一类操作为入库操作,以及该次入库的货物数量;第二类操作为出库操作。这些记录都严格按时间顺序排列。入库和出库的规则为先进后出,即每次出库操作货物为当前在仓库里所有货物中最晚入库的货物。

? 为了便于分析,现在加入了第三类查询操作,每次查询时,输出当前仓库数量最多的货物的数量。

输入

?输出

样例输入

13
0 1
0 2
2
0 4
0 2
2
1
2
1
1
2
1
2

样例输出

2
4
4
1
0

?

关键词:

分析:

这道题重点在于需要用高效的方法获取最大的元素。

仓库中的元素不断的出栈和入栈,可能改变栈当中最大元素的情况只有两种:

1. 新加入的元素大于等于目前栈当中的最大的元素。

2. 出栈的元素是当前栈中的最大元素。

便发现,改变栈中最大元素的时刻只会在进出时发生,如果进入栈中的新元素比栈最大元素小,则入栈和出栈不会对栈中最大元素大小造成影响。

如此,就利用一个栈专门来保存栈中最大元素。

代码:

#include <iostream>
#include <vector>

#include <stack>


using namespace std;

class Cargo {
public:
    Cargo() {
    }

    void store(int n) {
        stuffs.push_back(n);
        if (maxVals.empty() || n >= maxVals.top()) {
            maxVals.push(n); // when there is a new highest number, push that number into stack
        }
        // cout << "now high is " << high << endl;
    }

    void out() {
        if (isEmpty())
            return;
        int popNumber = stuffs.back();
        stuffs.pop_back();
        if (popNumber == maxVals.top()) {
            maxVals.pop();
        }        
    }

    bool isEmpty() {
        if (stuffs.empty()) {
            return true;
        }
        return false;
    }

    void mostLotCargo() {
        if (isEmpty()) 
            opResult.push_back(0);
        // return this->high;
        else {
            opResult.push_back(maxVals.top());
        }
    }


    void showOpResult() {
        for (auto &ele : opResult) {
            printf("%d\n", ele);
        }
    }

    void showStuffs() {
        // cout << "show stuffs " << endl;
        for (auto ele : stuffs) {
            cout << ele << " ";
        }
        cout << endl;
    }

private:
    vector<int> stuffs;
    stack<int> maxVals;
    vector<int> opResult;

};

// main

int main() {
    Cargo c;

    int numberOfOps;
    cin >> numberOfOps;

    for (int i = 0; i < numberOfOps; i++) {
        int op;
        scanf("%d", &op);
        if (op == 0) {
            int number;
            scanf("%d", &number);
            c.store(number);
        }

        else if (op == 1) {
            c.out();
        }
        else if (op == 2) {
            c.mostLotCargo();
        }
        // c.operation(op);
    }

    c.showOpResult();
    // c.showStuffs();
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:18:24  更:2021-07-26 12:20:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/18 10:15:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码