[μλ£κ΅¬μ‘°] Chapter3. STACKS AND QUEUES(1)
β» μ΄ μΉ΄ν κ³ λ¦¬μ κΈλ€μ 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;
}
λ€μ μ₯μμλ μ€νκ³Ό νλ₯Ό μ¬μ©νλ λ¬Έμ λ€μ 곡λΆν΄λ΄ μλ€.π