1. 程式人生 > >隊列及其簡單應用

隊列及其簡單應用

插入 就會 mes 沒有 譯文 代碼 外存 規則 軟件

什麽是隊列

隊列是一種先進先出,後進後出的線性表.
同棧相反,隊列一頭進,而另外一頭出.我們同樣可以通過畫圖來理解隊列.
技術分享圖片


如何去實現或模擬隊列的操作

我們可以用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;
}

隊列及其簡單應用