์ž๋ฃŒ ๊ตฌ์กฐ

ํ ๊ฐœ๋…

youngdeok 2023. 2. 28. 19:09

ํ์˜ ์ถ”์ƒ์ž๋ฃŒํ˜•

void QueueInit(Queue *pq)

  • ํ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ํ ์ƒ์„ฑํ›„ ์ œ์ผ ๋จผ์ € ํ˜ธ์ถœ ๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

int QIsEmpty(Queue *pq)

  • ํ๊ฐ€ ๋นˆ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

void Enqueue(Queue *pq, Data data)

  • ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ data๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

Data Dequeue(Queue *pq)

  • ์ €์žฅ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์•ž์„  ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
  • ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ˜ํ™˜๋œ๋‹ค.
  • ๋ณธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•จ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

Data QPeek(Queue *pq)

  • ์ €์žฅ์ˆœ์„œ๊ฐ€ ๊ฐ€์žฅ ์•ž์„  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋˜ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ณธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•จ์ด ๋ณด์žฅ๋˜์–ด์•ผํ•œ๋‹ค.

ํ๋Š” ์„ ์ž…์„ ์ถœ, ๋จผ์ € ๋„ฃ์€ ์ž๋ฃŒ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ง›์ง‘์˜ ์ค„์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ์ค„์€ ์„  ์‚ฌ๋žŒ์ด ๊ฐ€์žฅ ๋จผ์ € ์Œ์‹์„ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ํ์ค‘์—์„œ ์›ํ˜•ํ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉ ํ•ด์„œ ๊ตฌํ˜„ ํ•˜์˜€์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์›ํ˜•์˜ ํ†ต์— data๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ์ด์œ ๋Š” ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์˜€์„ ๋•Œ, ์•ž์—์„œ ๋„ฃ๊ณ  ๋’ค์—์„œ ๋นผ๊ธฐ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์ด ๊ฐ€๋“ ์ฐจ์ง€ ์•Š์•„๋„ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋„˜์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

typedef struct _cQueue
{
    int front;
    int rear;
    Data queArr[QUE_LEN];
} cQueue;

์œ„์—์„œ front์™€ rear๋Š” ๋ณ€์ˆ˜ ๋ช…์—์„œ ์•Œ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฐฐ์—ด์˜ ๋จธ๋ฆฌ์™€ ๊ผฌ๋ฆฌ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค. ํ์˜ ๊ฒฝ์šฐ ๋’ค์—์„œ ๋นผ๊ธฐ ๋–„๋ฌธ์— rear๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์‚ญ์ œํ•˜๊ณ , ์•ž์—์„œ ๋ถ€ํ„ฐ ๊ฐ’์„ ๋„ฃ๊ธฐ ๋–„๋ฌธ์— front๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์‚ฝ์ž…ํ•œ๋‹ค.

๊ฐ’์ด ๊ฝ‰์ฐจ๋ฉด rear + 1 = front๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์„ ์ „๋ถ€ ์‚ญ์ œํ•ด ๋น„์–ด์žˆ๋‹ค๋ฉด?.

rear + 1 = front๊ฐ€ ๋œ๋‹ค.

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋Š” ๋ฐฐ์—ด์ค‘ ํ•˜๋‚˜๋ฅผ ๋น„์›Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

๋น„์›Œ์ ธ ์žˆ์„ ๊ฒฝ์šฐ rear == front, ๊ฐ€๋“ ์ฐจ์žˆ์„ ๊ฒฝ์šฐ rear + 1 = front๊ฐ€ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ๋ฐ”ํƒ•์œผ๋กœ ์›ํ˜•ํ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

void EnQueue(Queue *pq, Data data)
{
    if (NextPosIdx(pq->rear) == pq->front)
        exit(1);
    pq->rear = NextPosIdx(pq->rear);
    pq->queArr[pq->rear] = data;
}

Data DeQueue(Queue *pq)
{
    if (QIsEmpty(pq))
        exit(1);
    pq->front = NextPosIdx(pq->front);
    Data dData = pq->queArr[pq->front];

    return dData;
}

NextPosIdx()์€ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋„˜์—ˆ์„ ๊ฒฝ์šฐ 0์„, ์•„๋‹ˆ๋ฉด ๋‹ค์Œ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์›ํ˜• ํ ์ฝ”๋“œ: https://boiling-fowl-6d6.notion.site/CircularQueue-5e8b296f563e44088dd9d27376fadc87

๋…ธ๋“œ ๊ธฐ๋ฐ˜ ํ ์ฝ”๋“œ: https://boiling-fowl-6d6.notion.site/Queue-5c05c1cd15bf4815ae6de230640d3980