C++栈和队列
来源:互联网 发布:网络注册学籍是什么 编辑:程序博客网 时间:2024/05/16 12:44
使用标准库的栈和队列时,先包含相关的头文件(使用C++命名空间:using namespace std;)
#include<stack>
#include<queue>
定义栈如下:
stack<int> stk;
定义队列如下:
queue<int> q;
栈提供了如下的操作
s.empty() 如果栈为空返回true,否则返回false s.size() 返回栈中元素的个数 s.pop() 删除栈顶元素但不返回其值 s.top() 返回栈顶的元素,但不删除该元素 s.push() 在栈顶压入新元素队列提供了下面的操作
q.empty() 如果队列为空返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队列首元素但不返回其值 q.front() 返回队首元素的值,但不删除该元素 q.push() 在队尾压入新元素 q.back() 返回队列尾元素的值,但不删除该元素
栈的应用
数制转换:
将一个非负的十进制整数N转换为另一个等价的基为B的B进制数的问题,很容易通过"除B取余法"来解决。
【例】将十进制数13转化为二进制数。解答:按除2取余法,得到的余数依次是1、0、1、1,则十进制数转化为二进制数为1101。
分析:由于最先得到的余数是转化结果的最低位,最后得到的余数是转化结果的最高位,因此很容易用栈来解决。
具体算法如下:
#include <STACK> //C++中使用栈要包含的头文件 using namespace std;//这个也是要加的void jinzhi(int N,int B){ //假设N是非负的十进制整数,输出等值的B进制数 stack<int> S; //创建一个元素类型为int型的空栈 while(N) { S.push(N%B); //将转换后的数值,从底位到高位开始入栈 N=N/B; } while(!S.empty())//栈非空时退栈输出 { printf("%d",S.top()); //打印栈顶元素 S.pop(); //将栈顶元素出栈 }}int main(){ jinzhi(10,2);}
队列的应用
舞伴问题
1、问题叙述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者,等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
2、问题分析
先入队的男士或女士亦先出队配成舞伴。因此该问题具体有典型的先进先出特性,可用队列作为算法的数据结构。
在算法中,假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,算法输出此队列中等待者的人数及排在队头的等待者的名字,他(或她)将是下一轮舞曲开始时第一个可获得舞伴的人。
3、具体算法及相关的类型定义
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者,等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。
2、问题分析
先入队的男士或女士亦先出队配成舞伴。因此该问题具体有典型的先进先出特性,可用队列作为算法的数据结构。
在算法中,假设男士和女士的记录存放在一个数组中作为输入,然后依次扫描该数组的各元素,并根据性别来决定是进入男队还是女队。当这两个队列构造完成之后,依次将两队当前的队头元素出队来配成舞伴,直至某队列变空为止。此时,若某队仍有等待配对者,算法输出此队列中等待者的人数及排在队头的等待者的名字,他(或她)将是下一轮舞曲开始时第一个可获得舞伴的人。
3、具体算法及相关的类型定义
#include <queue>//C++中使用队列要包含的头文件</span>#include <cstdio>using namespace std;typedef struct{ char name[20]; char sex; //性别,'F'表示女性,'M'表示男性} Person;void DancePartner(Person dancer[],int num){ //结构数组dancer中存放跳舞的男女,num是跳舞的人数。 Person p; queue<Person> Mdancers,Fdancers; for(int i = 0; i < num; i++) { //依次将跳舞者依其性别入队 p=dancer[i]; if(p.sex=='F') Fdancers.push(p); //排入女队 else Mdancers.push(p); //排入男队 } printf("The dancing partners are: \n \n"); while(!(Fdancers.empty()||Mdancers.empty())) { //依次输入男女舞伴名 p=Fdancers.front(); //获取女队第一人 Fdancers.pop(); //出队 printf("%s ",p.name); //打印出队女士名 p=Mdancers.front(); //获取男队第一人 Mdancers.pop(); //出队 printf("%s\n",p.name); //打印出队男士名 } if(!Fdancers.empty()) { //输出女士剩余人数及队头女士的名字 printf("\n There are %d women waitin for the next round.\n",Fdancers.size()); p=Fdancers.front(); //取队头 printf("%s will be the first to get a partner. \n",p.name); } else if(!Mdancers.empty()) { //输出男队剩余人数及队头者名字 printf("\n There are%d men waiting for the next round.\n",Mdancers.size()); p=Mdancers.front(); printf("%s will be the first to get a partner.\n",p.name); } else { printf("There is not person in the queue!"); }}//DancerPartnersint main(){ Person p[] = {{"A",'F'},{"B",'F'},{"C",'M'},{"D",'M'}}; DancePartner(p,4);}
0 0
- C++:栈和队列
- 数据结构-------C栈和队列
- C实现栈和队列
- 【C语言/C++】 栈和队列
- C语言实现,顺序队列,循环队列,和栈!
- C/C++中的堆、栈和队列
- 栈和队列 C语言实现
- 数据结构与算法(C#)--栈和队列
- 数据结构伪C代码:栈和队列
- 【C++】STL队列和栈的使用
- 栈和队列的操作(c)
- 栈和队列(C语言版)
- 括号分配(栈和队列)C
- c/c++数据结构 栈和队列
- 【数据结构】【C++STL】栈和FIFO队列
- (C++)栈和队列的模拟实现
- 栈和队列--队列
- 【栈和队列】队列
- VanetMobiSim安装
- Linux命令之nohup
- 【bzoj 十连测】[noip2016十连测第八场]Problem C: 幻魔皇(递推)
- 第十二周 OJ 转化进制
- Linux命令之scp
- C++栈和队列
- Java-关键字及作用
- Java-XML解析
- 需求技术讨论
- 学习随记
- vs2010 配置boost环境变量 使用增加环境变量的方式,不是绝对路径
- 进制转换(十进制转二进制)
- Date和TimeZone的关系
- 勾股定理一日一证连载164