シンプルキュー
問題
キューを実装します。数値を入力するとアクションを意味します。(EOFで終了)1
はキューにプッシュすることを意味します。別の整数がそれに続く
ことを約束します。つまり、プッシュする値を意味します。キューがいっぱいの場合、Push
Failedを印刷します。キューがいっぱいです。キューがいっぱいでない場合は、キューにプッシュし
ます。(何も出力しない)0は、キューの先頭の値をポップすることを意味します。
ポップアウトされたばかりの値を出力します。キューが空の場合、
Pop Popを印刷します。キューは空です。キューが空でない場合は、
値を出力します。この割り当てでは、サイズが10のキューで十分です。サンプル
入力
0
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
0
0
0
0
0
0
0
0
0
出力例
Pop Failed. The queue is empty.
Push Failed. The queue is full.
1
2
3
4
5
6
7
8
9
10
Pop Failed. The queue is empty.
ヒント(循環キュー)
私のBBを見たくない場合は、この部分をスキップするか、
ウィキペディアに移動して、これを説明する非常に素晴らしいgifを参照してください。
キューはFIFO(先入れ先出し)のデータ構造です。つまり、最初にプッシュされるデータが最初にポップされます。
通常、配列を使用して循環キューを実装します。
たとえば、int my_queue [11];などです。
次に、フロント/リアがどこにあるかを知る必要があります。したがって、前部/後部のインデックスを格納する2つの「ポインター」を取得します。
int front_index = 0、rear_index = 0;
次に、これで、彼らの位置がわかるので、変更できます。
プッシュする方法は?
my_queue [rear_index ++] =値; 値を設定し、rear_indexを移動します。
ポップするには?
front_index ++; front_indexを移動します。今はその値にアクセスできないので、ポップ(削除)したようです。
サーキュラーとは?
フロントはF、リアはR。
このキューはいっぱいです。(次の部分で理由を説明します)
キュー:[1、2、3、4、5、6、7、8、9、10]
1 2 3 4 5 6 7 8 9 10 N
^ ^
FR
2回ポップすると、
キュー:[3、4、5、6、7、8、9、10]
1 2 3 4 5 6 7 8 9 10 N
^ ^
FR
5と6を押す
キュー:[3、4、5、6、7、8、9、10、5、6]
6 2 3 4 5 6 7 8 9 10 5
^ ^
RF
次に、rear_indexが最後に到達しましたが、反対側から再び出てきました。それだけです、まさに円です。
これを実装するには、インデックスが変更されたときに、インデックス%= 11;と記述する必要があります。
なぜ11ではなく10なのですか?
ここでは、配列の長さは11ですが、使用できるスペースは10個のみです。
満タンか空かを知る必要があります。ここでは、front_index == rear_indexの場合は空であると見なし、rear_index + 1 == front_indexの場合はいっぱいであると見なします。
空の
NNNNNNNNNNN
^
F / R
いっぱい
1 2 3 4 5 6 7 8 9 10 N
^ ^
FR
この実装方法では、my_queue [rear_index]は常に到達不能です。データがある位置を指している場合、front_index == Rear_indexのときに空であるかどうかはわかりません。
(確かに、この制限なしに実装する方法は他にもいくつかあります)
これが、11桁の配列で使用できるスペースは10のみであるためです。
それでもわからない場合は、自分で検索してください。
回答
include<stdio.h>
int main()
{
int a,b,c=0;
int x[10]={0};
while(scanf("%d",&a)!=EOF)
{
if(a==1)
{
scanf("%d",&b);
if(c>=10)
printf("Push Failed. The queue is full.\n");
else
x[c++]=b;
}
if(a==0)
{
if(c<=0)
printf("Pop Failed. The queue is empty.\n");
else{
printf("%d\n",x[0]);
for(b=1;b<=9;b++)
x[b-1]=x[b];
c--;
}
}
}
return 0;
}