隊列及其簡單應用


##什么是隊列 隊列是一種先進先出,后進后出的線性表. 同棧相反,隊列一頭進,而另外一頭出.我們同樣可以通過畫圖來理解隊列. ![隊列結構圖](https://img-blog.csdn.net/20180721072505655?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvbmFsZG83X1pZQg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM