🤔큐

🔑배열로 큐 구현

큐는 스택과 다르게 뒤로 집어 넣고 앞에서 꺼내는 방식이라서 처음(head)과 끝(tail)을 나타내는 인덱스가 필요합니다. 일단 배열의 인덱스는 0부터 시작하므로 head와 tail 인덱스들을 -1로 초기화해줍니다.

1
2
3
4
5
6
7
8
9
const int QUEUE_SIZE = 10;

struct Queue
{
    int container[QUEUE_SIZE]{};
    int head{-1};
    int tail{-1};
};

정수를 큐에 넣고자(Enqueue) 한다면 tail 인덱스를 하나 증가시킨 곳에 해당 정수를 큐 배열에 넣으면 됩니다.

정수를 큐에서 빼고자(Dequeue) 한다면 큐 배열에서 head 인덱스를 하나 증가시켜줍시다.

큐에 원소가 들어가면 tail이 증가하고 원소가 빠지면 head가 증가합니다. 따라서, head와 tail이 같아지면 큐 배열에는 원소가 없는 상태입니다.

큐의 사이즈를 구할때는 tail 인덱스에서 head 인덱스를 빼주면 됩니다.



🔑전체 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <string>
 
const int QUEUE_SIZE = 10;
 
struct Queue
{
    int container[QUEUE_SIZE]{};
    int head{-1};
    int tail{-1};
};
 
void UserInput(Queue& queue, std::string temp);
void Enqueue(Queue& queue, int value);
void Dequeue(Queue& queue);
void Size(Queue& queue);
void Empty(Queue& queue);
void Print(Queue& queue);
 
int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
 
    Queue myQueue;
 
    while (true)
    {
        std::string temp;
 
        std::cin >> temp;
 
        UserInput(myQueue, temp);
 
        if (temp == "quit")
        {
            break;
        }
    }
}
 
void UserInput(Queue& queue, std::string temp)
{
    if (temp == "enqueue")
    {
        int value;
 
        std::cin >> value;
 
        Enqueue(queue, value);
    }
    else if (temp == "dequeue")
    {
        Dequeue(queue);
    }
    else if (temp == "size")
    {
        Size(queue);
    }
    else if (temp == "empty")
    {
        Empty(queue);
    }
    else if (temp == "print")
    {
        Print(queue);
    }
    else
    {
        return;
    }
}
 
void Enqueue(Queue& queue, int value)
{
    if (queue.tail == QUEUE_SIZE - 1)
    {
        return;
    }
 
    queue.container[++queue.tail] = value;
}
 
void Dequeue(Queue& queue)
{
    if (queue.head == queue.tail)
    {
        std::cout << -1 << '\n';
        return;
    }
 
    std::cout << queue.container[++queue.head] << '\n';
}
 
void Size(Queue& queue)
{
    std::cout << queue.tail - queue.head << '\n';
}
 
void Empty(Queue& queue)
{
    if (queue.head == queue.tail)
    {
        std::cout << 1 << '\n';
    }
    else
    {
        std::cout << 0 << '\n';
    }
}
 
void Print(Queue& queue)
{
    for (int i = 0; i < QUEUE_SIZE - 1; i++)
    {
        if (i <= queue.head || i > queue.tail)
        {
            std::cout << " ";
        }
        else
        {
            std::cout << queue.container[i] << " ";
        }
    }
    std::cout << '\n';
}



Leave a comment