C++ Primer 学习笔记_11_标准模板库_stack、queue队列容器与priority_queue优先队列容器

C++ Primer 学习笔记_11_标准模板库_stack、queue队列容器与priority_queue优先队列容器

1、stack堆栈

stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行。插入元素的一端称为栈顶,而另一端称为栈底。插入元素叫入栈(Push),删除元素叫出栈(Pop)。下图是堆栈示意图

堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法。采用push()方法将元素入栈;采用pop()方法出栈;采用top()方法访问栈顶元素;采用empty()方法判断堆栈是否为空,如果是空,返回true,否则,返回false。另外,可以采用size()方法返回当前堆栈有几个元素。

#include <iostream>
#include <stack>

using namespace std;

int main(int argc, char* argv[])
{
   stack<int> s;
   s.push(1);
   s.push(2);
   s.push(3);
   s.push(9);

   cout << "栈顶元素为:" << s.top() << endl;

   cout << "堆栈元素数量:" << s.size() << endl;

   while(s.empty() != true)
    {
       cout << "栈顶元素为:" << s.top() << endl;
       s.pop(); //出栈
    }

   if(s.empty())
       cout << "empty" << endl;
   return 0;
}

运行结果:

栈顶元素为:9

堆栈元素数量:4

栈顶元素为:9

栈顶元素为:3

栈顶元素为:2

栈顶元素为:1

empty

2、队列容器queue

队列容器queue是一个先进先出(FirstIn First Out,FIFO)的线性存储表,元素的插入只能在队尾,元素的删除只能在队首。图2-10是queue队列容器数据结构示意图。

queue队列具有入队push()、出队pop()、读取队首元素front()、读取队尾元素back()、判断队列是否为空empty()和队列当前元素的数目size()几种方法。

#include <iostream>
#include <queue>

using namespace std;

int main(int argc, char* argv[])
{
   queue<int> num;
   num.push(1);
   num.push(2);
   num.push(3);
   num.push(9);

   cout << num.size() << endl;
   cout << num.empty() << endl;
   cout << num.front() << endl;
   cout << num.back() << endl;
   while(!num.empty())
    {
       cout << num.front() << " ";
       num.pop();
    }
   cout << endl;
   return 0;
}

运行结果:

4

0

1

9

1 2  3  9

3、优先队列容器priority_queue

优先队列容器priority_queue与队列一样,只能从队尾插入元素,从队首删除元素。但它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素的值由大到小排序;当然,可以重载“<”操作符来重新定义比较规则。也可以重载“()”重新定义比较规则。

声明的头文件也为#include<queue>。

3.1  优先队列的使用方法

优先队列包含入队push()、出队pop()、读取队首元素top()、判断队列是否为空empty()和队列当前元素的数目size()几种方法。

#include <iostream>
#include <queue>

using namespace std;

int main(int argc, char* argv[])
{
   priority_queue<int> num;
   num.push(1);
   num.push(2);
   num.push(3);
   num.push(9);

   cout << num.size() << endl;
   cout << num.empty() << endl;
   cout << num.top() << endl;
   while(!num.empty())
    {
       cout << num.top() << " ";
       num.pop();
    }
   cout << endl;
   return 0;
}

运行结果:

4

0

9

9 3  2  1

3.2  重载“<”操作符来定义优先级

如果优先队列的元素类型是结构体,可以通过在结构体中重载“<”操作符的方法来修改优先队列的优先级。

#include <iostream>
#include <queue>
#include <string>

using namespace std;

struct Info{
   string name;
   float score;
   bool operator < (const Info &a) const
    {
       return a.score < score;
    }
};

int main(int argc, char* argv[])
{
   priority_queue<Info> student;
   Info info;

   info.name = "Jack";
   info.score = 68.5;
   student.push(info);

   info.name = "Bomi";
   info.score = 18.5;
   student.push(info);

   info.name = "Peti";
   info.score = 90;
   student.push(info);

   while(!student.empty())
    {
       cout << student.top().name << " : " <<student.top().score << endl;
       student.pop();
    }
   return 0;
}

运行结果:

Bomi : 18.5

Jack : 68.5

Peti : 90

3.3  重载“()”操作符来定义优先级

如果优先队列的元素不是结构体类型,则可以通过重载“()”操作符的方式来定义优先级。当然,元素是结构体类型,也可以通过重载“()”操作符的方式来定义优先级,而不一定要在结构体内重载“<”操作符才行。

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

struct myComp
{
    booloperator () (const int &a, const int &b)
    {
       return a > b;
    }
};

int main(int argc, char* argv[])
{
   //定义优先队列,元素类型为myComp,显式说明内部结构式vector
   priority_queue<int, vector<int>, myComp> num;
   num.push(1);
   num.push(9);
   num.push(2);
   num.push(30);

   while(!num.empty())
    {
       cout << num.top() << " ";
       num.pop();
    }
   cout << endl;
   return 0;
}

运行结果;

1 2  9  30

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 23:24:32

C++ Primer 学习笔记_11_标准模板库_stack、queue队列容器与priority_queue优先队列容器的相关文章

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

C++ Primer 学习笔记_10_标准模板库_map和set的对比

C++ Primer 学习笔记_10_标准模板库_map和set的对比   set multiset 创建 set<int> str multiset<string> str 插入 str.insert(8) str.insert("abc") 遍历 set<int>::iterator iter multiset< string >::iterator iter 输出 *iter *iter 删除 n = str.erase(8) 删除

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个