โป ์ด ์นดํ ๊ณ ๋ฆฌ์ ๊ธ๋ค์ knu EK.Ryu ๊ต์๋์ <์๋ฃ๊ตฌ์กฐ> ์์ ์ ๋ฃ๊ณ ๋๋ฆ๋๋ก ํ์๊ฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
โป ๋ถ์กฑํ ์ค๋ช ์ด ์๊ฑฐ๋, ์๋ชป ์๊ณ ์์ฑํ ๋ถ๋ถ์ด ๋ณด์ธ๋ค๋ฉด ํธํ๊ฒ ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐

3.1 Stack
์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ญ์ ํ๋๋ฐ LIFO(Last In, First Out) ๋ฐฉ์์ผ๋ก ์๋ํ๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ์ฆ, ๋ง์ง๋ง์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋๊ฐ๋ ๊ตฌ์กฐ์ ๋๋ค.

์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ, A, B, C, D, E ์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , ์ญ์ ํ ๋๋ E๋ถํฐ ์ ๊ฑฐ๋ฉ๋๋ค.
์คํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ (push), ๋นผ๋(pop) ํจ์์ ๋ํด์ ์๋์์ ์์๋ณด๊ฒ ์ต๋๋ค.
void push(element item) // ๋ฐ์ดํฐ ์ถ๊ฐ
{
if (top >= MAX_STACK_SIZE - 1)
stackFull();
stack[++top] = item;
}
void stackFull() // ์คํ์ด ๊ฝ ์ฐผ์ ๋ ์ค๋ฅ ์ถ๋ ฅ
{
fprintf(stderr, "Stack is full, cannot add element");
exit(EXIT_FAILURE);
}
element pop() // ์คํ์์ ๋ฐ์ดํฐ ๋ฝ๊ธฐ(๊ฐ์ฅ ์์ ์๋!)
{
if (top == -1)
return stackEmpty();
return stack[top--];
}
3.2 Stacks Using Dynamic Arrays
๋ฐฐ์ด์ ์ด์ฉํ ์คํ์ ๋ฐ์ดํฐ๊ฐ ์คํ์ ์ฉ๋์ ๋์ด์ ์์ผ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋์ ํ ๋น์ ์ด์ฉํ๋ค๋ฉด, ์คํ์ ํฌ๊ธฐ๊ฐ ๊ฐ๋ ์ฐฐ ๋ ๋์ ์ผ๋ก ๋ฐฐ์ด์ ๋ ๋ฐฐ ๋๋ ค ์ด ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ ์ ์์ต๋๋ค.
pop() ํจ์๋ ๊ทธ๋๋ก์ด๊ณ , push() ํจ์์ stackFull() ํจ์๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
void push(element item)
{
if (top >= capacity - 1)
stackFull();
stack[++top] = item;
}
void stackFull()
{
REALLOC(stack, 2 * capacity * sizeof(*stack));
capacity *= 2;
}
3.3 Queues
ํ๋ FIFO(First In, First Out) ๋ฐฉ์์ผ๋ก ๋์ํ๋ ์๋ฃ๊ตฌ์กฐ๋ก, ๋จผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋๊ฐ๋ ๊ตฌ์กฐ์ ๋๋ค.
์ฝ์ ์ ํ์ ๋ค์ชฝ(rear)์์ ์ด๋ฃจ์ด์ง๊ณ , ์ญ์ ๋ ์์ชฝ(front)์์ ์ด๋ฃจ์ด์ง๋๋ค.

ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. 1์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ ํ
2. 1์ฐจ์ ๋ฐฐ์ด์ ์ํ์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์ด์ฉํ๋ ์ํ ํ
(1) 1์ฐจ์ ๋ฐฐ์ด ํ
๋จผ์ 1์ฐจ์ ๋ฐฐ์ด ํ๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
void addq(element item)
{
// add an item to the queue
if (rear == MAX_QUEUE_SIZE - 1)
queueFull();
queue[++rear] = item;
}
element deleteq()
{
// remove element at the front of the queue
if (front == rear)
return queueEmpty();
return queue[++front];
}
์ด 1์ฐจ์ ๋ฐฐ์ด ํ์๋ ์์ ์ ์งํํ๋ฉด์ ํ๊ฐ ์ ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.

์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ผ์ชฝ์ผ๋ก ์ด๋์ํค๋ ๋ฐฐ์ด ์ด๋(array shifting) ์์ ์ด ํ์ํฉ๋๋ค. ํ์ง๋ง ์ด ์์ ์๋ ์๊ฐ ๋ณต์ก๋๊ฐ O(MAX_QUEUE_SIZE)๋ก ๋งค์ฐ ๋นํธ์จ์ ์ด๊ธฐ ๋๋ฌธ์ ๋์์ผ๋ก ์ํํ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
(2) ์ํ ํ Circular Queue

์ํ ํ๋ ๋ฐฐ์ด์ ๋์์ ๋ค์ ๋ฐฐ์ด์ ์ฒ์์ผ๋ก ๋์๊ฐ ์ ์๋๋ก ๊ตฌํ๋์ด, ๋ฐฐ์ด์ ๋์ ๋๋ฌํ์ ๋ ์ ์ฒด๋ฅผ ๋ค์ ์ด๋์ํค์ง ์๊ณ ๋ ํจ์จ์ ์ผ๋ก ํ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด ์ค๋๋ค.
์๋ ์ฝ๋์์ ์ํ ํ์ ์ฝ์ , ์ญ์ ์ฝ๋๋ฅผ ํ์ธํด ๋ด ์๋ค.
void addq(element item)
{
rear = (rear + 1) % MAX_QUEUE_SIZE;
if (front == rear)
queueFull();
queue[rear] = item;
}
element deleteq()
{
if (front == rear)
return queueEmpty();
front = (front + 1) % MAX_QUEUE_SIZE;
return queue[front];
}
์ฝ๋๋ฅผ ํตํด ์ํ ํ์ ํน์ง์ ํ๋ ์ ์ ์๋๋ฐ, ํ๋ ๊ฝ ์ฐผ์ ๋๋ ๋ฆฌ์คํธ์ ํ ์๋ฆฌ๊ฐ ๋น์ด์๊ฒ ๋ฉ๋๋ค.
์ด๋ ์ํ ํ์์ front์ rear๊ฐ ๋์ผํ ๋ ํ๊ฐ ๋น์ด์๋ ์ํ์ ๊ฐ๋ ์ฐฌ ์ํ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
3.4 Circular Queues using Dynamic Arrays
์ํ ํ๊ฐ ๊ฐ๋ ์ฐผ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ๋์ ํ ๋น์ ์ด์ฉํ ์ ์์ต๋๋ค.

์ ์ด๋ฏธ์ง๋ ์ํ ํ๊ฐ ๊ฐ๋ ์ฐผ์ ๋๋ฅผ ํํํ ๊ฒ์ผ๋ก, ์ค์ ๋ก ์ํ ํ๋ 1์ฐจ์ ๋ฐฐ์ด ํํ์ด๊ธฐ ๋๋ฌธ์ (b)์ ํํ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.

(b)์ ์ํ์์ realloc์ ํ์ฌ ์ํ ํ์ ํฌ๊ธฐ๋ฅผ 2๋ฐฐ ๋๋ฆฐ๋ค๋ฉด, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ํ ํ์ ํน์ง์ ๊ณ ๋ คํ์ง ์์, (c)์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ์ด ๊ฐ์ด๋ฐ์ ํฐ ๋น ๊ณต๊ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
(d): ์ด๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์๋ 6, 7๋ฒ index์ ๋ค์ด์๋ ๊ฐ๋ค์ ์ค๋ฅธ์ชฝ ๋์ผ๋ก shifting ์์ผ ํด๊ฒฐํ๊ฑฐ๋,
(e): ๊ฝ ์ฐฌ ๋ฐฐ์ด์ ๊ฐ๋ค์ ๋ณต์ฌ ํ, malloc์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ํ ํ์ ํฌ๊ธฐ๋ฅผ ๋์ ํ ๋น์ผ๋ก ๋๋ฆฌ๋ ๋ ๋ฐฉ๋ฒ์ ๋น๊ตํด ๋ด ์๋ค: realloc --> shifting vs malloc

๋จผ์ , ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ฉด ๋ฐฐ์ด์ 2๋ฐฐ๋ก ํ์ฅํ๊ณ ์์๋ฅผ ์ค๋ฅธํธ์ผ๋ก ๋ฏธ๋ ๊ฒ์ ๋ค ํฉ์ณค์ ๋ ์ต๋ 2 * capacity - 2์ ์์๋ฅผ ๋ณต์ฌํ๊ฒ ๋ฉ๋๋ค.

๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์์๋ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ malloc์ ์ด์ฉํด์ ๋ฐฐ๊ฐํ ๋ ๊ฐ๋ค์ ์ ๋ณต์ฌํด์ ๋ฃ์์ผ๋ก์จ capacity-1๋ก ๋ณต์ฌํ ์์ ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ฝ๋๋ฅผ ํ ๋ฒ ์์ฑํด๋ด ์๋ค.
์ด ์ฝ๋์์ ํจ์ copy(a, b, c)๋ ์์น a์์ b-1๊น์ง์ ์์๋ฅผ c์์ ์์ํ๋ ์์น๋ก ๋ณต์ฌํ๋ ํจ์์ ๋๋ค.
void addq(element item)
{
rear = (rear + 1) % MAX_QUEUE_SIZE;
if (front == rear)
queueFUll();
queue[rear] = item;
}
void queueFUll()
{
// ์ด์ ํ์ ํฌ๊ธฐ๋ฅผ ๋ ๋ฐฐ๋ก ํ์ฅ
element* newQueue;
MALLOC(newQueue, 2 * capacity * sizeof(*queue));
// ํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ํ๋ก ๋ณต์ฌ
int start = (front + 1) % capacity;
if (start < 2)
copy(queue + start, queue + start + capacity - 1, newQueue);
else
{
copy(queue + start, queue + capacity, newQueue);
copy(queue, queue + rear + 1, newQueue + capacity - start);
}
// ์๋ก์ด ํ์ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธ
front = 2 * capacity - 1;
rear = capacity - 2;
capacity *= 2;
free(queue);
queue = newQueue;
}


๋ค์ ์ฅ์์๋ ์คํ๊ณผ ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ค์ ๊ณต๋ถํด๋ด ์๋ค.๐
'๐CS > ๐Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] hw1 ์ ๊ทผ ํ๊ธฐ๋ฒ ์ฆ๋ช (0) | 2024.10.15 |
---|---|
[์๋ฃ๊ตฌ์กฐ] Chapter3. STACKS AND QUEUES(2) (0) | 2024.10.15 |
[์๋ฃ๊ตฌ์กฐ] Chapter2. Arrays and Structures(2) (0) | 2024.10.05 |
[์๋ฃ๊ตฌ์กฐ] Chapter2. Arrays and Structures(1) (0) | 2024.10.01 |