シンプルキュー

シンプルキュー


問題

キューを実装します。数値を入力するとアクションを意味します。(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;
}

おすすめ

転載: blog.csdn.net/jessiaflora/article/details/78677075