이전 게시글에서의 스택과 큐는 배열 크기가 고정되어 있었습니다. 이번에는 배열 크기가 고정되지 않고 필요에 따라 확장할 수 있게 코드를 조금 변형해 보겠습니다. 본 게시글에서는 변경 사항만 언급합니다. 일부 생략된 내용이 있으므로 링크해드린 이전 게시글과 함께 읽으실 것을 권해드립니다.
// 변경 전
typedef struct IntStack {
int Elements[5];
int Top;
} IntStack;
// 변경 후
typedef struct IntStack {
int* Elements;
int Top;
int Size;
} IntStack;
Elements
를 int*
형으로 선언했습니다.Size
변수를 추가했습니다.// 변경 전
int Push(IntStackP Stack, int Element) {
If (IsFull(Stack) == True)
Error(0);
...
}
// 변경 후
int Push(IntStackP Stack, int Element) {
If (IsFull(Stack) == True)
Realloc(Stack);
...
}
Realloc
함수가 실행됩니다.void Realloc(IntStackP Stack) {
int* Temp;
Temp = (int*)calloc(Stack->Size * 2, sizeof(int));
for (int C = 0; C < Stack->Size; C++) Temp[C] = Stack->Elements[C];
Stack->Size = Stack->Size * 2;
free(Stack->Elements);
Stack->Elements = Temp;
}
Realloc
함수가 단순히 배열 크기를 2배로 늘린다고 생각해서는 안 됩니다. Realloc
함수는 기존 배열을 새로 생성한 배열로 대체합니다.IntStackP Init() {
...
Temp->Size = 5;
Temp->Elements = (int*)calloc(5, sizeof(int));
...
}
Init
함수에 다음 작업을 수행하는 코드 두 줄이 추가되었습니다:// 변경 전
typedef struct IntQueue {
int Elements[6];
int Rear, Front;
} IntQueue;
// 변경 후
typedef struct IntQueue {
int* Elements;
int Rear, Front;
int Size;
} IntQueue;
Elements
를 int*
형으로 선언했습니다.Size
변수를 추가했습니다. 이에 따라 #define ARRAY_SIZE *
로 정의된 매크로 변수는 삭제됩니다. 코드 내 매크로 변수 ARRAY_SIZE
는 모두 IntQueue
구조체의 Size
변수로 대체됩니다.IntQueue P Init() {
...
Temp->Elements = (int*)calloc(6, sizeof(int));
Temp->Size = 6;
...
}
Init
함수에 다음 작업을 수행하는 코드 두 줄이 추가되었습니다:// 변경 전
int Add(IntQueueP Queue, int Element) {
if (IsFull(Queue) == 1)
Error(1);
...
}
// 변경 후
int Add(IntQueueP Queue, int Element) {
if (IsFull(Queue) == 1)
Realloc(Queue);
...
}
Realloc
함수가 실행됩니다.void Realloc(IntQueueP Queue)
{
int* Temp, Free;
Temp = (int*)calloc(Queue->Size * 2, sizeof(int));
for (int C = 0; C < Queue->Size; C++) Temp[C] = Queue->Elements[C];
Queue->Size = (Queue->Size - 1) * 2 + 1;
free(Queue->Elements);
Queue->Elements = Temp;
}