C++栈和队列

140 阅读4分钟

使用标准库的栈和队列时,先包含相关的头文件(使用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、具体算法及相关的类型定义 

#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!");
    }
}//DancerPartners

int main()
{
    Person p[] = {{"A",'F'},{"B",'F'},{"C",'M'},{"D",'M'}};
    DancePartner(p,4);
}




\

\