队列及其简单应用

Posted pigzhouyb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列及其简单应用相关的知识,希望对你有一定的参考价值。

什么是队列

队列是一种先进先出,后进后出的线性表.
同栈相反,队列一头进,而另外一头出.我们同样可以通过画图来理解队列.
技术分享图片


如何去实现或模拟队列的操作

我们可以用head和tail表示,head表示指向对头的指针,tail表示指向队尾的指针.
我们设q为模拟队列的数组,那么对于5个元素q={2,5,7,4,6}中,head指向2其数值为1,tail指向6其数值为5.由此,我们可以得出结论:
1.当队列元素只有一个,head=tail
2.当队列元素有多个,head<tail
3.当队列内存在元素,head≤tail
4.当一个队列不存在时,head>tail
如何实现进队与出队的操作?
进队:我们假设进队元素为k,则只需要在尾部插入元素k即可

tail++;
q[tail]=k;

出队:只需要将对头右移一个即可

head++;

作弊的发牌者

题目描述

贝茜正在与她的N-1(2 <= N <= 100)个朋友打牌。她们玩的牌一副为K(N <= K <= 100,000,K为N的倍数)张。所有牌中,一共有M(M = K / N)张“好
牌”,其余的K - M张为“差牌”。
贝茜是游戏的发牌者,很自然地,她想把所有好牌都留给自己。她热衷于获胜,即使为此必须采取一些不正当的手段。
在若干局游戏后,贝茜的朋友们开始怀疑贝茜在游戏中作弊,于是她们想了个对策:使用新的发牌规则。规则具体如下:
1.贝茜把牌堆的最上面一张发给她右边的奶牛
1.每当贝茜发完一张牌,她都得将牌堆顶部接下来的P(1 <= P <= 10)张牌 放到底部去(一般把这个操作称为切牌)
1.然后,贝茜对逆时针方向的下一头奶牛重复上述的操作
贝茜绝望地认为,她再也不可能获胜了,于是她找到了你,希望你告诉她,将好牌放在初始牌堆的哪些位置,能够确保它们在发完牌后全集中到她手里。顺带说明一下,我们把牌堆顶的牌定义为1号牌,从上往下第二张定义为2号牌,依此类推。
输入格式
第1行: 3个用空格隔开的整数:N、K,以及P
输出格式
第1..M行: 每行输出一个正整数,表示贝茜应该在初始牌堆的这个位置放一张好牌。所有的位置按升序输出。
input
3 9 2
output
3
7
8

显然,这道题目我们需要去模拟其发牌情况,因此需要用队列进行操作.
根据其操作间隔,每一都进行以此将对头出队,将队尾入队的操作.每一次枚举到的队头即为好牌.
代码如下:

#include<bits/stdc++.h>
using namespace std;
int N,K,P;
int tot[120]={},now;
int Cards[120][120000]={};
int q[10000000]={},H=1,T;
int main()
{
    cin>>N>>K>>P;
    for (int i=1;i<=K;i++)
        q[i]=i;
    T=K;
    now=2;
    for (;H<=T;)
    {
        Cards[now][++tot[now]]=q[H++];
        now=now%N+1;
        for (int i=1;i<=P;i++)
        {
            q[++T]=q[H];
            H++;
        }
    }
    sort(Cards[1]+1,Cards[1]+tot[1]+1);
    for (int i=1;i<=tot[1];i++)
        cout<<Cards[1][i]<<endl;
    return 0;
}

机器翻译

【问题描述】
小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。假设内存中有 M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M?1 ,软件会将新单词存入一个未使用的内存单元;若内存中已存入 M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。假设一篇英语文章的长度为 N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。
【样例 1】
ex_translate1.in
3 7
1 2 1 5 4 4 1
ex_translate1.out
5
这道题目,其实同样是用队列来模拟的整一个过程.
即把每一次查询的单词存入队列:
新存入的相当于入队操作,后存入的相当于出队操作
代码如下:(emmmm比较难看,这是第一次书写队列的代码,请谅解)

#include<bits/stdc++.h>
using namespace std;
int l=1,r=1,n,m,a[1000000],flag[1000000]={},q[10000000],ans=0;
int main()
{
    cin>>m>>n;
    for (int i=1;i<=n;i++)cin>>a[i];
    for (int i=1;i<=n;i++)
    {
        if (!flag[a[i]])
        {
            if (r-l==m) flag[q[l++]]=0;
            q[r++]=a[i];
            flag[a[i]]=1;
            ans++;
        }
    }
    cout<<ans;
}







































以上是关于队列及其简单应用的主要内容,如果未能解决你的问题,请参考以下文章

计算机程序的思维逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

转载用队列求解迷宫最短路径及其应用(围住神经猫)

# Java 常用代码片段

# Java 常用代码片段

队列及其应用

2021-7-8 单调队列及其应用