
[code]

    #include <stdio.h>
    #define MAX 4
    void enquene(char *Q,char x);
    char dequeue(char *Q);
    void initialize(char *Q);
    int empty(char *Q);
    int head=0;
    int tail=0;
    int number=0;
    void enqueue(char *Q,char x){
        if(number<MAX){
            number++;
            tail=(tail%MAX)+1;
            Q[tail]=x;
        }
        else{
            printf("Queue Q is overflows.\n");
        }
    }
    char dequeue(char *Q){
        if(number>0){
            number--;
            head=(head%MAX)+1;
            return(Q[head]);
        }
        else{
            printf("Queue Q is empty.\n");
            return('0');
        }
    }
    void initialize(char *Q){
        int i;
        head=0;
        tail=0;
        number=0;
        for(i=0;i<MAX;i++){
            Q[i]='\0';
        }
    }
    int empty(char *Q){
        if(number==0){
            return(1);
        }
        return(0);
    }
    int main(void){
        char x;
        char Q[MAX];
        enqueue(Q,'a');
        enqueue(Q,'b');
        enqueue(Q,'c');
        x=dequeue(Q);
        x=dequeue(Q);
        enqueue(Q,'d');
        x=dequeue(Q);
        enqueue(Q,'e');
        while(!empty(Q)){
            printf("%c",dequeue(Q));
        }
        printf("\n");
        return(0);
    }
    
[/code]


CC BY-SA 4.0
2022-05-18T03:27:12.650
88895
2022-05-26T04:53:13.797
2022-05-26T04:53:13.797
51596
52683
question
c
キューで関数enqueueとdequeueを行った時の配列内は、どのようになるのですか？


まず、main関数内のキュー/エンキュー処理毎のあるべきキューの中身を整理すると以下のものです。  
[![キュー/エンキュー処理毎のあるべきキューの中身](https://i.stack.imgur.com/TLjC3.png)](https://i.stack.imgur.com/TLjC3.png)  
したがって、出力として想定しているのは「de」になると思いますが、想定通りの出力ができなかったため質問を記述したという認識です。  
想定通りの出力ができなかった理由としては、Q[tail]、Q[head]で配列外参照をしたため想定通りにならなかったと思います。  
main内の処理の提示されたソースコードにおけるdequeueとenqueue実行後のtailとheadの値を整理すると以下の通りです。  
[![tailとheadの値](https://i.stack.imgur.com/mQj2G.png)](https://i.stack.imgur.com/mQj2G.png)  
したがって配列のサイズは4で、配列はQ[0]～Q[3]なのですが、head・tailがそれぞれ4になることがあり配列外参照をしていることがわかると思います。  
これは「tail=(tail%MAX)+1;」「head=(head%MAX)+1;」部分の誤りによるためです。  
それぞれ「tail=((tail+1)%MAX);」「head=((head+1)%MAX);」に修正すれば想定通りの結果になると思われます。


CC BY-SA 4.0
2022-05-18T15:29:11.637
88909
2022-05-18T15:35:54.883
2022-05-18T15:35:54.883
52603
52603
88895
answer