队列_queue<nod>l-程序员宅基地

基础知识

先进先出。STL中与队列对应的类模板为queue ,常用操作:front()返回第一个元素;back()返回最后一个元素;push()向队尾插入元素;pop()删除第一个元素;empty()检查容器是否为空;size()返回容器的元素数。所有操作都在O(1)时间内完成。
关于队列的实现方式,详见: 栈与队列-顺序队列与链队列类模板的实现(数据结构基础 第3周)

应用:两个栈实现队列

题目:用两个栈实现一个队列。请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除结点的功能。
分析:相关题目:用两个队列实现一个栈。
代码实现

template<typename T> 
class CQueue {
public:
    CQueue(void);
    ~CQueue(void);

    void appendTail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;
};

template<typename T> 
CQueue<T>::CQueue(void) {}

template<typename T> 
CQueue<T>::~CQueue(void) {}

template<typename T> 
void CQueue<T>::appendTail(const T& node) {
    stack1.push(node);
}

template<typename T> 
T CQueue<T>::deleteHead() {
    if(stack2.empty()) {
        while(!stack1.empty()) {
            T data=stack1.top();
            stack1.pop();
            stack2.push(data);
        }
    }
    if(stack2.empty()) throw "The queue is empty.";
    T head=stack2.top();
    stack2.pop();
    return head;
}

测试用例

应用:滑动窗口的最大值

题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5},如表8.3所示。
分析方法1,笨方法,老老实实滑动;方法2,对方法1找冗余,一句话核心思想:维护一个队列,一直保持队列的头元素为滑动至当前位置时滑窗内的最大元素;方法3,我们实现过用 O(1) 时间得到最大值的栈,也实现过用两个栈实现队列,把这两者结合起来就是能够在 O(1) 时间获得最大值的队列。
代码实现

//笨方法,时间复杂度$O(nk)$
int SlidingWindowMaximum_1(const vector<int>& input, int windowSize, vector<int>& result) {
    int dataSize = input.size();
    if (windowSize < 1) return 1;
    if (dataSize < windowSize) return 1;
    deque<int> cache(input.begin(), input.begin()+ windowSize-1);
    for (int i = windowSize - 1; i<dataSize; i++) {
        cache.push_back(input.at(i));
        result.push_back(*max_element(cache.begin(), cache.end()));   //此句时间复杂度为O(K)
        cache.pop_front();
    }
    return 0;
}

//找冗余,时间复杂度$O(n)$
//核心思想:维护一个队列,一直保持队列的头元素为滑动至位置i时滑窗内的最大元素。
int SlidingWindowMaximum_2(const vector<int>& input, int windowSize, vector<int>& result) {
    int dataSize = input.size();
    if (windowSize < 1) return 1;
    if (dataSize < windowSize) return 1;
    deque<int> cache(input.begin(), input.begin() + windowSize - 1);
    for (int i = windowSize - 1; i<dataSize; i++) {
        if (cache.size() >= windowSize) {           //队列已满
            cache.pop_front();                //取出第一个
            cache.push_back(input.at(i));
            cache.erase(cache.begin(), max_element(cache.begin(), cache.end()) );  //队列中最大元素之前的元素已毫无意义
        }
        else {
            if (!cache.empty() && input.at(i) > cache.front()) {   //如果元素i大于队列中的最大元素(即头元素),则队列中已存的所有元素已毫无意义。此处一定要判断队列是否为空,要不然怎么能取头元素front()呢?
                cache.clear();              
            }
            cache.push_back(input.at(i));
        }
        result.push_back(cache.front());      //此句时间复杂度为O(K)
    }
    return 0;
}

测试用例

vector<int> input = { 2, 3, 4, 2, 6, 2, 5, 1 };

应用:从上往下打印二叉树

题目: 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
分析: 也就是树的层序遍历了。
代码实现

int SequenceTraversalByQueue(BinaryTreeNode* root) {
    if(!root) return 1;
    queue<BinaryTreeNode*> q;
    q.push(root);
    BinaryTreeNode* p=NULL;
    while(!q.emtpy()){
        p=q.front();
        cout << p->value << " ";
        if(p->left) q.push(p->left);
        if(p->right) q.push(p->right);
        q.pop();
    }
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NNNNNNNNNNNNY/article/details/61237522

智能推荐

数据结构与算法——每日一练(7月)_第行不能编译通过,因为只有一个-程序员宅基地

文章浏览阅读2.1k次。文章目录每日一练7.17.27.37.47.57.67.87.77.97.107.117.127.137.147.157.167.177.187.197.207.217.227.237.247.257.267.277.287.297.307.31每日一练7.1以下叙述中,正确的是()。A. 只要无向连通图中没有权值相同的边,则其最小生成树唯一B. 只要无向图中有权值相同的边,则其最小生成树一定不唯一C. 从n个顶点的连通图中选取n-1条权值最小的边,即可构成最小生成树D. 设连通图G含有n_第行不能编译通过,因为只有一个

SpringBoot Jpa +Oracle ORA-00001: 违反唯一约束条件 自增序列_jpa 唯一约束违规-程序员宅基地

文章浏览阅读2.2k次。@Entity@Data@Table(name = "PERSON")@SequenceGenerator(name="PersonSeq",sequenceName="PERSON_ID")public class Person { //主键自增长 @GeneratedValue(generator="PersonSeq") @Id private Long id; pr..._jpa 唯一约束违规

2015最新WebQQ3.0协议解析与实现-程序员宅基地

文章浏览阅读124次。2015最新WebQQ3.0协议解析与实现(一)2015最新webqq密码加密分析2015最新WebQQ3.0协议解析与实现(三)2015最新WebQQ3.0协议解析与实现(四)webqq协议综合篇,这个不是关于最新WebQQ的,但是内容很全。转载于:https://www.cnblogs.com/xwz0528/p/4800129.html..._webqq2015

VSCode 调试C/C++设置_vscode debug c++ setup commands-程序员宅基地

文章浏览阅读649次。进入 vscode 文件夹,找到 “.vscode” 文件夹,对配置文件配置文件 launch.json 和 tasks.json 进行设置(没有就新建):launch.json:需修改一处:将"miDebuggerPath" 选项设置为你的调试器(gdb.exe)所在位置,即 mingw64 的安装位置{ "version": "0.2.0", "configurations": [ { "name": "C/C++", _vscode debug c++ setup commands

ConcurrentLinkedQueue的原理以及CAS机制在其中的应用_concurrentlinkedqueue cas-程序员宅基地

文章浏览阅读845次。ConcurrentLinkedQueue是一个线程安全队列,区别于阻塞算法的锁机制,它使用了基于CAS机制的非阻塞算法。_concurrentlinkedqueue cas

vulnhub xxe解析-程序员宅基地

文章浏览阅读397次。xxe原理就不进行介绍了XXE环境搭建xxe下载地址:https://download.vulnhub.com/xxe/XXE.zip也可以进去vulnhub,搜索xxe然后下载下载之后直接用虚拟机打开ovf文件安装之后的界面使用nmap扫描内网,发现一个157地址开放80打开之后出现下面界面表示安装成功根据要求是在/xxe/目录下进行测试,如果不知道的话可以用目录扫描工具进行扫描使用bp抓包看到用户名和密码被xml语句包含,由此想到xxe漏洞在构造语句前,目录扫描也有了结

随便推点

雁过留痕 - 值得“在此一游”的网络资源(持续更新中)_雁过留痕可以表示来玩过吗-程序员宅基地

文章浏览阅读390次。有时候偶尔会发现一些很不错的网站,但时间长了,当想在网络上学习学习,开阔开阔视野,却总是不长记性。在这里记录一下,没准还能造福他人。技术类:Ray Wenderlich Tutorials for developers & gamers_雁过留痕可以表示来玩过吗

c++模拟鼠标事件_通过鼠标事件进行三维建模c++开发案例-程序员宅基地

文章浏览阅读1.6w次。Q: How can I emulate mouse events in an application?A:There are two API fucntions that you can use:'mouse_event()'. 'SendInput()'. Which of the two API functions should I use?The 'mouse_event()' function has been superseded by 'SendInput()' on Window NT/20_通过鼠标事件进行三维建模c++开发案例

Matlab2019b中配置最小均方误差滤波器(dsp.LMSFilter)详细设置-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏35次。主动降噪设计中涉及的最小均方误差算法(LMS)2019b版本中AudioToolbox添加的新功能设置注意:本程序与2016b版本以前不兼容主动降噪设计中最核心的算法莫过于LMS了,实在是太经典了,目前主流的多为LMS算法演化。后面会介绍LMS function的编写,在这里仅介绍如何快速的建立LMS滤波器并进行仿真设计。%% Least mean square filter 自适应滤波器工..._dsp.lmsfilter

51单片机时间戳相关函数_unix时间戳c51单片机-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏9次。函数使用了long变量,比较占RAM,单片机要是空间紧张就别用了,会把mcu算糊涂的。/******* timestamp时间戳函数 开始**********/#define SECOND_OF_DAY 86400 //一天多少秒idata uchar DayOfMon[]={31,28,31,30,31,30,31,31,30,31,30,31};/*******************..._unix时间戳c51单片机

C语言之指针篇,快速上手系列-C语言之指针篇(一)-程序员宅基地

文章浏览阅读205次。指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂。当然指针不是万能的,但没有指针是万万不能的,有些操作没有指针是办不到的,如动态内存分配。鉴于学习指针的必要性,从现在开始介绍指针方面的知识,本篇主要介绍指针相关概念及指针的定义与应用两方面的内容:指针相关概念1、指针:我们使用的计算机内存为8G,系统为了更好地管理我们的内存,就为内存区的每一个字节都分配一个编..._c语言指针项目练手

软件测试:黑盒测试用例的四种设计方法_黑盒测试用例常用的设计方法-程序员宅基地

文章浏览阅读651次。在对每一输出的同时进行边值分析时,要先确定输出域的全部边值,再设计不同的数据覆盖输出域的边值,这样就能有效地保证输出域的边值被覆盖。对于在测试行业发展的小伙伴们来说应该会很有帮助,有需要的朋友你可以dd我。不能盲目猜想,不能盲目猜测,需要了解系统的薄弱之处和开发人员的盲点,还需要根据以前的缺陷分析报告,分析系统中最容易出现错误的地方,以此作为误判方法的依据。在测试过程中,需要分析每个输出的等价类,在输出域中通常需要确定输出域的所有可能情况,然后对输出的结果进行分类,最后需要设计输入来覆盖所有输出的结果。_黑盒测试用例常用的设计方法

推荐文章

热门文章

相关标签