|

½ºÅðú Å¥¸¦ ÀÀ¿ëÇØ¼ ¸¸µç
ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ±×³É ¸¶¿ì½ºÀÇ ¿òÁ÷ÀÓÀ» ±â¾ïÇØ¼ ±×´ë·Î Ç÷¹ÀÌ ÇÏ´Â ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ½ºÅÿëÀº ¿Ã¸®Áö
¾Ê¾Ò½À´Ï´Ù. ÀÌ °ÍÀº Å¥¸¸À» ÀÀ¿ëÇÑ °ÍÀÔ´Ï´Ù. ¾Æ·¡ ±ÛÀº ÀÌ °ÍÀ» ¸¸µé ¶§ »ý°¢Çß´ø
°ÍµéÀÔ´Ï´Ù^^
½ºÅÃÀº ÇϳªÀÇ ÀÚ·á ±¸Á¶ÀÔ´Ï´Ù. ¿ì¸®°¡ ¹è¿À» ¸» ÇÒ¶§ °°Àº ÇüÀÇ ÀڷḸ ¸ðÀ» ¼ö ÀÖ´Â ÀÚ·á ±¸Á¶ ¶ó°í ¸»Çϵí ÀÌ ½ºÅõµ ÇϳªÀÇ ÀÚ·á ±¸Á¶ÀÔ´Ï´Ù. ÇÏÁö¸¸ ½ºÅÃÀº ÀÚ½ÅÀÌ ÇàÀ§Àû Ãø¸éÀ» Æ÷ÇÔÇÏ´Â ÀÚ·á ±¸Á¶¶ó´Â °ÍÀÌ Á» ´Ù¸£ ÁÒ. ¿©±â¼ ÇàÀ§Àû Ãø¸éÀ̶ó´Â °ÍÀÌ ¹Ù·Î ¾Ë°í¸®ÁòÀ» ¸»ÇÕ´Ï´Ù. ½ºÅÃÀº pop() °ú push() ¶ó´Â ÇàÀ§Àû Ãø¸éÀÌ ÀÖ ½À´Ï´Ù. pop()Àº ÀڷḦ ½ºÅÿ¡¼ Çϳª ²¨³»¿À´Â °ÍÀ̰í push()´Â ÀڷḦ ½ºÅÿ¡ Çϳª Áý¾î ³Ö´Â °ÍÀ» ¸»ÇÕ´Ï ´Ù. ±×¸®°í ½ºÅÃÀº ÀڷḦ ²¨³»°í ÀúÀå Çϴµ¥ ¹æ¹ýÀÌ ÀÖ½À´Ï´Ù. ¹Ù·Î óÀ½ µé¾î¿Â ÀÚ·á°¡ Á¦ÀÏ ¸¶Áö¸·¿¡ ³ª°£´Ù ÀÔ´Ï´Ù. ¹Ù·Î À̰ÍÀ» LIFO(Last In First Out) ±¸Á¶¶ó°í ÇÕ´Ï´Ù.

À§ÀÇ ±×¸²À» º¸¸é 4¸¦ Çѹø push() ÇÏ°í ´Ù½Ã pop() ÇÏ¿´½À´Ï´Ù. ¿©±â¼ Áß¿äÇÑ °ÍÀº ¹Ù·Î top À̶ó´Â °ÍÀÔ´Ï´Ù. ÀÌ topÀ̶ó´Â °ÍÀº ½ºÅÃÀÇ ²À´ë±â¸¦ °¡¸®Å°°í ÀÖ´Â À妽º°¡ µÇ°Ú½À´Ï´Ù. ±×·¡¼ ½ºÅÃÀÌ ²Ë Â÷¸é ´õÀÌ»ó push() ÇÒ ¼ö ¾øÀ¸¹Ç·Î top() °ªÀ» Á¶»çÇÏ¿© Áö±Ý ½ºÅÃÀÌ Full ÀÎÁö ¾Æ´Ï¸é Empty ÀÎÁö ¾Ë¾Æº¾´Ï´Ù. 1Â÷ ¿¹Á¦´Â ¹è¿À» »ç¿ëÇÏ¿© Á¦ÇÑµÈ Å©±â¸¦ °¡Áö´Â ½ºÅÃÀ» ¸¸µé¾î º¸°Ú½À´Ï´Ù. ÀÌ °ÍÀº C·Î ¹è¿ì´Â ¾Ë°í¸®Áò Ã¥ ÀÇ ¿¹Á¦¸¦ Âü°í(¹è²¼½À´Ï´Ù^^;;;)Çß½À´Ï´Ù.
<¿¹Á¦ 1 ¹è¿·Î ±¸ÇöÇÏ´Â ½ºÅÃ>
//#############################//
// Stack Test Simulation No. 1 //
//#############################//
#include <stdio.h>
#define MAX 10
int stack[10]; //¿ì¸®°¡ »ç¿ëÇÒ ½ºÅà ũ±â´Â intÇü º¯¼ö¸¦ 10°³ ³ÖÀ» ¼ö ÀÖ´Â 20¹ÙÀÌÆ®(16bitÄÄÆÄÀÏ·¯ ±âÁØ)
int top; //½ºÅÃÀÇ »ó´ÜÀ» °¡¸®Å³ º¯¼ö
void init_stack(void)
{
top = -1; //topÀÇ ÃʱⰪÀ» -1·Î ¼¼ÆÃ
}
int push(int t)
{
if( top >= MAX - 1) //½ºÅÃÀÌ ²Ë Â÷ÀÖ´ÂÁö¸¦ Á¶»çÇϰí ÀÖ´Ù
{
printf("\t\n Stack overflow.");
return -1;
}
stack[++top] = t; //À妽º¸¦ ¸ÕÀú Áõ°¡½Ã۰í ÀÚ·áÀúÀå topÀ» ¿Ö -1·Î Çß´ÂÁö ¾Æ½Ã°ÚÁÒ?
return t;
}
int pop(void)
{
if(top < 0) //½ºÅÃÀÌ ÅÖ ºñ¾î ÀÖ´ÂÁö¸¦ Á¶»çÇϰí ÀÖ´Ù
{
printf("\n Stack underflower.");
return -1;
}
return stack[top--]; //ÀڷḦ ²¨³»°í À妽º Çϳª °¨¼Ò
}
void print_stack(void) //½ºÅÃÀÇ ÇöÀç ¸ð½ÀÀ» º¸¿©ÁØ´Ù.
{
int i;
printf("\n Stack contents : top -----> Bottom\n");
for(i= top; i>=0; i--)
printf("%-6d",stack[i]);
}
void main(void)
{
int i;
init_stack();
printf("\nPush 5,4,7,8,2,1");
push(5);
push(4);
push(7);
push(8);
push(2);
push(1);
print_stack();
printf("\nPop");
i = pop();
print_stack();
printf("\n popping value is %d",i);
printf("\push 3, 2, 5, 7, 2");
push(3);
push(2);
push(5);
push(7);
push(2);
print_stack();
printf("\Now stack is full, push 3");
push(3);
print_stack();
printf("\nInitialize stack");
init_stack();
print_stack();
printf("\nNow stack is empty, pop");
i = pop();
print_stack();
printf("\n popping value is %d", i);
}
°á°ú´Â ¿©±â¿¡ ÀûÁö ¾Ê°Ú½À´Ï´Ù. Á÷Á¢ ÇØº¸½Ã±æ ¹Ù¶ø´Ï´Ù. ^^ ±×·¡¾ß ½Ç·ÂÀÌ...^^
ÀÌ ½ºÅÃÀº ¹è¿·Î ±¸ÇöÇÏ¿´½À´Ï´Ù. ±×·³ ÀÌ ½ºÅÃÀº ÁÁÀº ½ºÅÃÀÌ µÉ ¼ö ÀÖÀ»±î¿ä? ´ë´äÀº ¾Æ´Ï¿À ÀÔ´Ï´Ù. »óȲ¿¡ µû¶ó ±×·² ¼öµµ ÀÖ°ÚÁö¸¸ µÇºÎºÐ À¯¿ëÇÑ ½ºÅÃÀÌ µÇÁú ¸ø ÇÕ´Ï´Ù. ¿Ö ±×·²±î¿ä? ±×°ÍÀº ¹è¿Àº Å© ±â°¡ ÇÑ Á¤µÇ¾î ÀÖ¾î¼ ¸Þ¸ð¸® ³¶ºñ¸¦ ÃÊ·¡ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î »ç¿ëÀÚ´Â 3°³ÀÇ ÀڷḸ ÀúÀåÇÏ´Â ½ºÅÃÀÌ ÇÊ¿äÇѵ¥ ¼³°èÀÚ´Â ÀÌ °ÍÀ» ¸ð¸£°í 10°³ÀÇ ÀڷḦ ÀúÀåÇÏ´Â ½ºÅÃÀ» ¸¸µé¾î ÁÖ¾ú´Ù°í »ý°¢ÇØ º¾½Ã´Ù. ±×·¯¸é 7°³ÀÇ ÀڷḦ ÀúÀåÇÏ´Â ¸Þ¸ð¸®°¡ ³¶ºñ°¡ µÇ´Â °ÍÀ̰ÚÁÒ. ±×·³ ¶§¿¡ µû¶ó ½ºÅÃÀÇ Å©±â°¡ ´Þ¶ó Á®¾ß ÇÏ´Â
µ¥ ±×·¸°Ô ÇÒ·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä? ¹Ù·Î µ¿ÀûÀÎ ¸Þ¸ð¸® ÇÒ´çÀÔ´Ï´Ù.(µ¿ÀûÀÎ ¸Þ¸ð¸® ÇÒ´çÀº ÇÁ·Î±×·¥ ¼öÇà
µµÁß¿¡ ¸Þ¸ð¸®¸¦ Àâ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù.)±×¸®°í ¸µÅ©µå ¸®½ºÆ®¶ó´Â °ÍÀ» »ç¿ëÇØ¼ ½ºÅÃÀ» ±¸ÇöÇÕ´Ï´Ù. ´ÙÀ½¿¡´Â
¸µÅ©µå¸®½ºÆ®¸¦ ÀÌ¿ëÇÏ¿© ½ºÅÃÀ» ±¸ÇöÇØ º¸°Ú½À´Ï´Ù.
################################################################################################
¸µÅ©µå ¸®½ºÆ®¸¦ ÀÌ¿ëÇÏ¿© ½ºÅÃÀ» ±¸ÇöÇÏ¸é ´ÙÀ½°ú °°Àº ÀÌÁ¡ÀÌ ÀÖ½À´Ï´Ù.
1. ÇöÀç ½ºÅÿ¡ ÀúÀåµÇ¾î ÀÖ´Â ÀÚ·á ¸¸Å¸¸ ¸Þ¸ð¸®¸¦ Àâ¾Æ¸Ô±â ¶§¹®¿¡ ¸Þ¸ð¸®°¡ Àý¾àµÈ´Ù. 2. ¸Þ¸ð¸®°¡ Çã¿ëÇÏ´Â Çѵµ¿¡¼ Ä¿Áú ¼ö ÀÖ´Ù.
¿¬°á¸®½ºÆ®¸¦ ÀÌ¿ëÇÏ´Â ½ºÅÃÀÇ ¸ð¾çÀº ¾Æ·¡ÀÇ ±×¸²°ú °°½À´Ï´Ù.
< ¿¹Á¦ 2. ¸µÅ©µå ¸®½ºÆ®¸¦ ÀÌ¿ëÇÑ ½ºÅà >
#include <stdio.h>
#include <alloc.h>
//³ëµåÀÇ ¸ð¾ç»õ(?)¸¦ ¸¸µé°í ÀÖ´Ù.
typedef struct tagNode
{
int data; //³ëµå°¡ ÀúÀåÇÒ ÀÚ·á
struct tagNode *next; //´ÙÀ½ ³ëµå¸¦ °¡¸®Å³ Æ÷ÀÎÅÍ (À̺κÐÀº ±âÃʹ®¹ý¼ÀûÀ» Âü°íÇϼ¼¿ä^^)
}node;
node* head; //head ³ëµå¿Í tail ³ëµå¸¦ ¼±¾ðÇϰí ÀÖ´Ù.
node* tail;
void init_stack(void) //³ëµå¸¦ ÃʱâÈ ÇØÁÖ´Â ÇÔ¼ö
{
head = (node *)malloc(sizeof(node)); //head¿Í tail³ëµå¸¦ ¸Þ¸ð¸®¿¡ Àâ°í ÀÖ´Ù
tail = (node *)malloc(sizeof(node)); //¿ø·¡ head¿Í tailÀº ¸Þ¸ð¸®¿¡ ÀâÀ» Çʿ䰡 ¾ø´Ù
head->next = tail; //À̵éÀº ÀڷḦ °®Áö ¾Ê°í ´ÜÁö °¡¸®Å³ »ÓÀ̱⠶§¹®ÀÌ´Ù.
tail->next = tail; //ÇÏÁö¸¸ ¿©±â¼´Â À̰ÍÀÌ ´õ ½±±â ¶§¹®¿¡ ^^....
}
//ÀڷḦ push ÇÏ´Â ÇÔ¼ö
int push(int k)
{
node* temp; //³ëµå¸¦ Ãß°¡½Ã۱â À§ÇÏ¿© Àӽà ³ëµå¸¦ ¸¸µê
if((temp = (node *)malloc(sizeof(node))) == NULL) //¸¸¾à ¸Þ¸ð¸®°¡ ¾øÀ» ¶§¿¡´Â ¿¡·¯¸¦ Ãâ·Â
{
printf("\n Out of Memory...");
return -1;
}
temp->data = k;
temp->next = head->next; //À̺κÐÀ» Àß ÀÌÇØÇÏ¼Å¾ß ÇÕ´Ï´Ù.
head->next = temp; //À̺κÐÀº ³ëµå¸¦ ¸µÅ©µå¸®½ºÆ®¿¡ Ãß°¡½ÃŰ´Â ºÎºÐÀÔ´Ï´Ù.
return k;
}
//ÀڷḦ popÇÏ´Â ÇÔ¼ö
int pop(void)
{
node* temp;
int i;
if(head->next == tail) //headÀÇ ´ÙÀ½ÀÌ tailÀÌ¸é ¸µÅ©µå ¸®½ºÆ®°¡ ºó °ÍÀ̹ǷΠ¿¡·¯¸¦ Ãâ·Â
{
printf("\n Stack underflow.");
return -1;
}
temp = head->next; //À̺κÐÀ» Àß ÀÌÇØÇÏ¼Å¾ß ÇÕ´Ï´Ù.
i = temp->data; //À̺κÐÀº ¸µÅ©µå ¸®½ºÆ®¿¡¼ ³ëµé¸£ Áö¿ì´Â °ÍÀÔ´Ï´Ù.
head->next = temp->next;
free(temp);
return i;
}
//¸ðµç ³ëµå¸¦ Áö¿ì´Â ÇÔ¼ö
void clear_stack(void)
{
node* current; //ÇöÀç ³ëµå¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ
node* old; //ÀÌÀü ³ëµå¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ
current = head->next; //ÇöÀç ³ëµå¸¦ headÀÇ ´ÙÀ½À¸·Î Çϰí ÀÖ´Ù
while( current != tail) //ÇöÀç ³ëµå°¡ tail ÀÏ ¶§±îÁö
{
old = current; // ÇöÀç ³ëµå¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¿¹Àü ³ëµå¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ¿¡ ÀúÀå
current = current->next; //ÇöÀç³ëµå¸¦ ÇöÀç³ëµåÀÇ ´ÙÀ½ ³ëµå·Î ¿Å±è
free(old); // ¿¹Àü ³ëµå »èÁ¦
}
head->next = tail;
}
//¸ðµç ³ëµå¸¦ º¸¿©ÁÖ´Â ÇÔ¼ö
void print_stack(void)
{
node* temp;
temp = head->next;
printf("\n Stack contents : Top ----> Bottom\n");
while( temp != tail)
{
printf("%-6d",temp->data);
temp = temp->next;
}
}
void main(void)
{
int i;
init_stack();
printf("\n Push 5, 4, 7, 8, 2, 1");
push(5);
push(4);
push(7);
push(8);
push(2);
push(1);
print_stack();
printf("\n Pop");
i = pop();
print_stack();
printf("\n popping value is %d", i);
printf("\nPush 3, 2, 5, 7, 2");
push(3);
push(2);
push(5);
push(7);
push(2);
print_stack();
printf("\nPush 3");
push(3);
print_stack();
printf("\nInitialize stack");
clear_stack();
print_stack();
printf("\nNow stack is empty, pop");
i = pop();
print_stack();
printf("\n popping value is %d",i);
}
¸µÅ©µå ¸®½ºÆ®¸¦ ÀÌ¿ëÇÑ ½ºÅÃÀ» ±¸ÇöÇØ ºÃ½À´Ï´Ù. ¾ÆÁÖ ÁÁ¾Æº¸ÀÌÁÒ? ¸Þ¸ð¸®ÀÇ Á¦¾àµµ °ÅÀÇ ¹ÞÁö ¾Ê°í ¸Þ¸ð¸®°¡ ¹«ÇÑ´ë¶ó¸é ½ºÅÃÀ» ¹«ÇÑ´ë·Î ´Ã¸± ¼ö ÀÖ´Â ¹æ¹ýÀÔ´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀÇ ¹®Á¦°¡ ¾Æ´Ï¶ó Ƽ°¡ ÀÖ´Ù¸é ¹«¾ùÀϱî¿ä? ÀÌ ¼Ò½º¸¦ ¸ÁÄ¡¿¡ ºñÀ¯ÇÏÀÚ¸é ÀÌ·¸½À´Ï´Ù. ¸ÁÄ¡¸¦ ¾µ ¶§¸¶´Ù ¸ÁÄ¡ ÀÚü¸¦ Á¶¸³ÇÑ ´ÙÀ½¿¡ ¸ÁÄ¡¸¦ ½á¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ ¸ÁÄ¡°¡ ÇÊ¿äÇÒ ¶§ ¿ì¸®´Â ±×³É ¸ÁÄ¡¸¦ ¾²Áö ´©°¡ ¸ÁÄ¡¸¦ ±× ¶§¸¶´Ù Á¶¸³Çؼ ¾¹´Ï±î? ±×·³ ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä?
À½... ½ºÅÃÀ» °´Ã¼·Î Á¤ÀÇÇÏ¸é ¾î¶³±î¿ä? ³ªÁß¿¡ ´Ù¸¥ ÇÁ·Î±×·¥¿¡¼ ÇÊ¿äÇÒ ¶§ ½ºÅà Ŭ·¡½º¸¸ °®´Ù°¡ ¾²¸é µÇ°Ú ÁÒ..^^ ±×·³ ¸ÁÄ¡°¡ ÇÊ¿äÇÒ ¶§ ¹Ù·Î ¸ÁÄ¡¸¸ °¡Á®´Ù ¾²µíÀÌ ¿ì¸®µµ ½ºÅÃÀÌ ÇÊ¿äÇÒ ¶§´Â ½ºÅø¸ °¡Á®´Ù ¾µ ¼ö ÀÖ½À ´Ï´Ù. ´ÙÀ½¿¡´Â ½ºÅÃÀ» Ŭ·¡½º·Î ±¸ÇöÇØ º¸°Ú½À´Ï´Ù.
################################################################################################
±âÁ¸ÀÇ ¼Ò½º¸¦ Ŭ·¡½ºÈ ÇÏ¿´½À´Ï´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ³ªÁß¿¡ Ŭ·¡½º¸¦ ÇϳªÀÇ ºÎǰ ¶Ç´Â µµ±¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù. ^^ ¾Æ·¡ ¼Ò½º ³ª°©´Ï´Ù^^..
< ¿¹Á¦ 3. Ŭ·¡½ºÈ ÇÑ ½ºÅà >
#include <stdio.h>
#ifndef STACK
#define STACK
typedef struct tagNode
{
int data;
tagNode* next;
}node;
class kStack
{
public:
//constructure /destructure
kStack();
~kStack();
//operation
int Pop(void);
int Push(int k);
void PrintStack(void);
void ClearStack(void);
private:
//attribute
node* head;
node* tail;
};
kStack::kStack() //»ý¼ºÀÚ¿¡¼ ½ºÅøµÅ©µå¸®½ºÆ®ÀÇ head¿Í tailÀ» ÃʱâÈ Çϰí ÀÖ½À´Ï´Ù.
{
head = new node[1];
tail = new node[1];
head->next = tail;
tail->next = tail;
}
kStack::~kStack() //¼Ò¸êÀÚ¿¡¼ head¿Í tail ¿¡ ÇØÁØ µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀ» Áö¿ì°í ÀÖ½À´Ï´Ù. *Áß¿ä*
{
delete [] head;
delete [] tail;
}
int kStack::Push(int k)
{
//C++ÀÇ new ¿¬»êÀÚ°¡ ´õ ÆíÇϰí ÁÁ±â ¶§¹®¿¡ malloc ´ë½Å¿¡ À̰ÍÀ» »ç¿ëÇß½À´Ï´Ù
node* temp = new node[1];
if(temp == NULL)
{
printf("\n Out of Memory...");
return -1;
}
temp->data = k;
temp->next = head->next;
head->next = temp;
return k;
}
int kStack::Pop(void)
{
node* temp;
int i;
if(head->next == tail)
{
printf("\n Stack underflow.");
return -1;
}
temp = head->next;
i = temp->data;
head->next = temp->next;
delete [] temp;
return i;
}
void kStack::PrintStack(void)
{
node* temp;
if(head->next == tail)
{
printf("\n Stack is Empty");
return;
}
temp = head->next;
printf("\n Stack contents : Top ----> Bottom\n");
while(temp != tail)
{
printf("%-6d",temp->data);
temp = temp->next;
}
}
void kStack::ClearStack(void)
{
node* current;
node* old;
if(head->next == tail)
{
printf("\n Stack is Empty do not clear");
return;
}
current = head->next;
while(current != tail)
{
old = current;
current = current->next;
delete [] old;
}
head->next = tail;
}
void main()
{
int i;
kStack stack;
printf("\n Push 5, 4, 7, 8, 2, 1");
stack.Push(5);
stack.Push(4);
stack.Push(7);
stack.Push(8);
stack.Push(2);
stack.Push(1);
stack.PrintStack();
printf("\n Pop");
i = stack.Pop();
stack.PrintStack();
printf("\n popping value is %d", i);
printf("\nPush 3, 2, 5, 7, 2");
stack.Push(3);
stack.Push(2);
stack.Push(5);
stack.Push(7);
stack.Push(2);
stack.PrintStack();
printf("\nPush 3");
stack.Push(3);
stack.PrintStack();
printf("\nInitialize stack");
stack.ClearStack();
stack.PrintStack();
printf("\nNow stack is empty, pop");
i = stack.Pop();
stack.PrintStack();
printf("\n popping value is %d",i);
}
#endif //STACK
¾î¶»½À´Ï±î? Ŭ·¡½º·Î ±¸ÇöÇϴϱñ Àǹ̰¡ ´õ¿í´õ Á¤È®ÇØ ÁöÁö ¾Ê¾Ò½À´Ï±î? ÇÏÁö¸¸ ÀÌ Å¬·¡½º¿¡µµ ¹®Á¦°¡ ÀÖ½À
´Ï´Ù. -_-;; ÀÚ²Ù¸¸ ¹«½¼ ¹®Á¦³Ä±¸¿ä...? ¿Ö ÀÚ²Ù µûÁö³Ä±¸¿ä? ±×¾ß ´õ ÁÁ°Ô ¸¸µé±â À§ÇؼÁö¿ä ^^;; ±×·³ ¹®Á¦Á¡ À» ¸»ÇØ º¸°Ú½À´Ï´Ù. »ç½Ç ÀÌ ½ºÅÃÀº ÀڷḦ intÇüÀÇ ÀÚ·á ¹Û¿¡ ÀúÀåÇÏÁö ¸ø ÇÕ´Ï´Ù. ±×·±µ¥ ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼´Â
±×·¸Áö ¾Ê°Åµç¿ä. ÇϳªÀÇ À©µµ¿ìÀÇ Á¤º¸¸¦ ÀúÀåÇѴٰųª... ¾Æ´Ï¸é ´Ù¸¥ ¿©·¯°¡Áö Á¤º¸°¡ ¼¯ÀÎ ÀڷḦ ½ºÅÿ¡ Àú
Àå ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ±×·³ ±× ¶§¸¶´Ù ±×¿¡ ¸Â´Â ½ºÅà Ŭ·¡½º¸¦ ¸¸µé¾î Áà¾ß ÇÒ±î¿ä???? ±×·¸´Ù¸é ÇÁ·Î±×·¡¸Óµé
Àº ½ºÆ®·¹½º ¶§¹®¿¡ Á×À» °ÍÀÔ´Ï´Ù. ±× ¶§ ÀÌ¿ëÇÏ´Â °ÍÀÌ C++ÀÇ ´ÙÇü¼ºÀ̶ó´Â °ÍÀÔ´Ï´Ù. ¿©±â¼´Â ´ÙÇü¼ºÀÇ ±Ø
Ä¡ÀÎ ¹Ù·Î template(ÅÛÇø´) À» »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ÅÛÇø´À» »ç¿ëÇÏ¿© Ŭ·¡½º¸¦ ¸¸µé¸é ¾î¶² ÀÚ·áÇüÀÌ µé¾î¿Íµµ
»ó°üÀÌ ¾ø°ÚÁÒ? ±×·³ ´ÙÀ½¿¡ ÅÛÇø´À¸·Î ¸¸µç ½ºÅÃÀ» ¿Ã¸®°Ú½À´Ï´Ù. ^^
##############################################################################################################
¾È³çÇϼ¼¿ä^^ ¿©±â±îÁö ¿À½Ã´À¶ó±¸ Èûµå ¼ÌÁÒ? Á¶±Ý¸¸ Èû³»½Ã±æ ¹Ù¶ø´Ï´Ù. ÀÌÁ¦ ½ºÅÃÀº °ÅÀÇ ´Ù ³¡³ª°¡´Ï±î¿ä^^
¿©±â¼ ¼Ò½º¸¦ ¼³¸íÇÏ°í ´ÙÀ½¿¡´Â ½ÇÁ¦ÀûÀ¸·Î ÇÁ·Î±×·¥¿¡ ½ºÅÃÀ» »ç¿ëÇÑ °æ¿ì¸¦ º¸¿©µå¸®°Ú½À´Ï´Ù.^^
#include <stdio.h>
#include <stdlib.h>
#ifndef TEMPLATE_STACK
#define TEMPLATE_STACK
template<class T>
class Stack
{
protected:
struct Node
{
Node* next;
T data;
};
private:
Node* head;
Node* tail;
public:
Stack();
~Stack();
void Push(T* d);
T* Pop(void);
T* Get(int index);
};
template<class T>
Stack::Stack()
{
head = new Node[1];
tail = new Node[1];
head->next = tail;
tail->next = tail;
}
template<class T>
Stack::~Stack()
{
delete [] head;
delete [] tail;
}
template<class T>
void Stack::Push(T *d)
{
Node* temp = new Node[1];
temp->data = *d;
temp->next = head->next;
head->next = temp;
}
template<class T>
T* Stack::Pop(void)
{
Node* temp;
T data2;
if(head->next == tail)
{
printf("\nStack is Empty");
exit(1);
}
temp = head->next;
data2 = temp->data;
head->next = temp->next;
delete [] temp;
return &data2;
}
template<class T>
T* Stack::Get(int index)
{
if(index == 0)
{
exit(1);
}
Node* temp;
temp = head;
for(int i=0; i < index; i++)
{
temp = temp->next;
}
return &(temp->data);
}
#endif
À§ÀÇ ¼Ò½º¸¦ º¸¸é Ŭ·¡½º ¾È¿¡ ±¸Á¶Ã¼°¡ ÀÖ½À´Ï´Ù. ¿Ö ±×·± °ÍÀϱî¿ä? ¾Æ·¡ÀÇ ±×¸²À» º¸¼¼¿ä.

ÀÌ ±×¸²À» º¸¸é ½ºÅà °´Ã¼¾È¿¡ ³ëµåµéÀÌ µé¾î ÀÖ½À´Ï´Ù. ¸¸¾à ÀÌ·¸°Ô ¼³°èÇÏÁö ¾ÊÀ¸¸é ¿ì¸®°¡ ³ëµå¿¡ ³ÖÀ» ÀÚ·áÇü
¿¡ ¹Ýµå½Ã ±× ÀÚ·áÇüÀ» °¡¸®Å³ ¼ö ÀÖ´Â Æ÷ÀÎÅͰ¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ±¸Á¶Ã¼·Î ¿¹·Î µé¸é .. ³»°¡ POINT¶ó´Â ±¸Á¶Ã¼¸¦
³ëµå¿¡ ³ÖÀ¸·Á ÇÒ ¶§ ¹Ýµå½Ã POINT¸¦ °¡¸®Å³ ¼ö ÀÖ´Â Æ÷ÀÎÅ͸¦ ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù´Â ¸»ÀÌÁÒ ´ÙÀ½°ú °°ÀÌ..
struct POINT
{
int x;
int y;
POINT* next; //POINT¸¦ °¡¸®Å³ ¼ö ÀÖ´Â Æ÷ÀÎÅÍ
};
ÇÏÁö¸¸ ¿ì¸®°¡ ÀúÀåÇÏ°í ½ÍÀº ÀÚ·á ÇüŸ¦ ¸¸µé ¶§¸¸´Ù Àú°ÍÀ» ì°ÜÁà¾ß Çϸé Á» ºÒÆíÇϰÚÁÒ... ±×·¡¼ Ŭ·¡½º¿¡
Node¶ó´Â ±¸Á¶Ã¼¸¦ Æ÷ÇÔÇÑ °ÍÀÔ´Ï´Ù.^^
ÀÌ stackÀÇ »ç¿ë¹ýÀº Stack<POINT> stack ÀÌ·± Çü½ÄÀ¸·Î ¼±¾ðÇØ ÁÖ°í¿ä POINT pt ÀڷḦ Push ÇÒ ¶§´Â ........
stack.Push(&pt); ÀÌ·¸°Ô Æ÷ÀÎÅ͸¦ ³Ñ°Ü ÁÝ´Ï´Ù. ÀÌ·¸°Ô ÇØ¾ß ¸Þ¸ð¸® ³¶ºñ°¡ ¾ø°ÚÁÒ?
±×¸®°í Pop()Àº POINT ÀÚ·áÇüÀÇ Æ÷ÀÎÅÍ(ÁÖ¼Ò)¸¦ ³Ñ°ÜÁÝ´Ï´Ù. ±×·¡¼ POINT* ptr = stack.Pop(); ÀÌ·¸°Ô »ç¿ë ÇØ
ÁÝ´Ï´Ù. ±×¸®°í ¸î ¹øÂ° ÀڷḦ ¾Ë°í ½ÍÀ» ¶§ POINT* ptr = stack.Get(2); // µÎ¹øÂ° ÀڷḦ ¾Ë°í ½ÍÀ» ¶§ ............
ÀÌ·¸°Ô »ç¿ëÇØ ÁÝ´Ï´Ù. ^^ ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¸ðµç ÀÚ·áÇüÀ» ÀúÁ¤ÇÒ ¼ö ÀÖ´Â ½ºÅÃÀÌ ¸¸µé¾î Á³½À´Ï´Ù. ^^
##############################################################################################################
ÀÌ ¹ø¿¡´Â Å¥¸¦ ÀÌ¿ëÇÏ¿© °í½ºÆ® ¸¶¿ì½º¶ó´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸°Ú½À´Ï´Ù. °í½ºÆ® ¸¶
¿ì½º¶ó´Â ÇÁ·Î±×·¥Àº ¸¶¿ì½º ¿òÁ÷ÀÓÀ» ±â¾ïÇß´Ù°¡ Ç÷¹À̸¦ ´©¸£¸é ¸¶¿ì½º°¡ ¿òÁ÷¿´´ø ´ë·Î Àç»ýÀÌ µÇ´Â ÇÁ·Î±×·¥
ÀÔ´Ï´Ù.^^ ¸¶¿ì½º°¡ °Å²Ù·Î°¡ ¾Æ´Ñ ¶È °°ÀÌ Àç»ýÀÌ µÇ´Ï±ñ Å¥°¡ ÇÊ¿äÇϰÚÁÒ?
¿©±â¼ Å¥(Queue)¶õ ½ºÅðú´Â ¹Ý´ë·Î óÀ½¿¡ µé¾î¿Â ÀÚ·á°¡ óÀ½¿¡ ³ª°¡´Â ÀÚ·á°¡ µÇ°Ú½À´Ï´Ù. ½ºÅÃÀ» ÀÌÇØÇϼ̴Ù
¸é ÀÌÇØ°¡ Àß µÇ½Ç °ÍÀÔ´Ï´Ù. ¿ì¸®°¡ °í½ºÆ® ¸¶¿ì½º¸¦ ¸¸µé±â À§ÇØ ÀúÀåÇØ¾ßÇÒ Á¤º¸´Â ¸¶¿ì½º ÁÂÇ¥ X,Y ¿Í ¸¶¿ì½º ¿Þ
ÂÊ ´©¸§ ¹öư È®ÀÎ(True/False) ±×¸®°í ¿À¸¥ÂÊ ¸¶¿ì½º ´©¸§ ¹öư È®ÀÎ(True/False) ÀÔ´Ï´Ù. ±¸Á¶Ã¼·Î Ç¥ÇöÇϸé....
struct MouseData{
LONG x;
LONG y;
BOOL IsLButtonDown;
BOOL IsRButtonDown;
};
ÀÌ µÇ°ÚÁÒ. ^^
±×·³ ÀÌ ·± ÀÚ·áÇüµµ ÀúÀåÇÒ ¼ö ÀÖ°í ¶Ç ´Ù¸¥ ÀÚ·áÇüµµ ÀúÀåÇÒ ¼ö ÀÖ´Â ÅÛÇø®Æ® Å¥¸¦ ¸¸µé¸é ÁÁÀ» °Í °°½À´Ï´Ù.
ÀÚ ¾Æ·¡ ÅÛÇø®Æ®·Î ¸¸µç Å¥ ¼Ò½º¸¦ »Ñ¸³´Ï´Ù. ¸µÅ©µå ¸®½ºÆ®¸¦ ÀÌ¿ëÇßÁö¸¸ ÀÌÁß ¸µÅ©µå ¸®½ºÆ®¸¦ ÀÌ¿ëÇß½À´Ï´Ù.
ÀÌÁßÀ» »ç¿ëÇÑ °ÍÀº Å¥°¡ ÀÔ±¸¿Í Ãⱸ°¡ ³ªÀ§¾îÁ® Àֱ⠶§¹®¿¡ ÀÌÁß ¸µÅ©µå ¸®½ºÆ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ Ç¥ÇöÇϱ⿡
ÆíÇÕ´Ï´Ù. ´ÜÀϷεµ ¹°·Ð ¾ïÁö·Î¶ó¸é ±¸ÇöÇÒ ¼öµµ ÀÖ½À´Ï´Ù.. ÇÏÁö¸¸ ¿Ø¸¸Çϸé Á¤½Å°Ç°À» À§ÇÏ¿© ^^
//##########################################################//
//## Template Queue ##//
//## ±è¼ºÃ¶ ##//
//## http://paran.pe.kg ##//
//## 2000. 5. 3 ##//
//##########################################################//
#ifndef KQUEUE
#define KQUEUE
#ifndef NULL
#define NULL 0
#endif
#include <stdio.h>
template<class T>
class Queue
{
protected:
struct Node
{
T data;
Node* next;
Node* prev;
};
public:
Queue();
virtual ~Queue();
//operation
void Push(T* d); //tail ³ëµå ¾Õ¿¡ »õ·Î¿î ³ëµå¸¦ Ãß°¡
void Get(T* buffer,int index); //index ¼ø¼¿¡ ÀÖ´Â °ªÀ» ¾ò¾î ¿Ã ¼ö ÀÖÀ½
void RemoveAll(void); //¸ðµç ³ëµå¸¦ Áö¿î´Ù
void Remove(T* buffer); //head ³ëµå ´ÙÀ½ ³ëµåÀÇ °ªÀ» ¾ò°í ±× ³ëµå¸¦ »èÁ¦ÇÑ´Ù.
private:
Node* head;
Node* tail;
};
//»ý¼ºÀÚ¿¡¼ head¿Í tailÀ» »ý¼ºÇÏ°í ±×µéÀÇ ¼·Î ¿¬°áÇÑ´Ù.
template<class T>
Queue::Queue()
{
head = new Node[1];
tail = new Node[1];
head->prev = head;
head->next = tail;
tail->prev = head;
tail->next = tail;
}
//¼Ò¸êÀÚ¿¡¼ head¿Í tailÀ» »èÁ¦ÇÑ´Ù.
template<class T>
Queue::~Queue()
{
delete [] head;
delete [] tail;
}
//Push ÇÔ¼ö´Â tail ¾Õ¿¡ »õ·Î¿î ³ëµå¸¦ ¸¸µç´Ù
template<class T>
void Queue::Push(T* d)
{
Node* insert = new Node[1];
if(insert == NULL)
{
printf("Error :: Push Function");
return;
}
insert->data = *d;
//tail ³ëµå ¾Õ¿¡ ³ëµå¸¦ Ãß°¡ÇÏ´Â ¸ð½À(?)
tail->prev->next = insert;
insert->prev = tail->prev;
tail->prev = insert;
insert->next = tail;
}
//index ¿¡ 3À̶ó°í ÁÖ¸é 3¹øÂ° ³ëµåÀÇ °ªÀ» ¾ò¾î¿Â´Ù.(¸¸¾à 3¹øÂ° ³ëµå°¡ ÀÖ´Ù¸é..)
template<class T>
void Queue::Get(T* buffer,int index)
{
if(head->next == tail)
{
printf("\nError :: Get Function");
return;
}
Node* temp;
temp = head->next;
for(int i=0; i < index; i++)
{
temp = temp-> next;
}
*buffer = temp->data;
}
//¸ðµç ³ëµå¸¦ »èÁ¦ÇÑ´Ù.
template<class T>
void Queue::RemoveAll(void)
{
if(head->next == tail)
{
printf("Error :: RemoveAll");
return;
}
Node* current;
Node* old;
current = head->next;
while(current != tail)
{
old = current;
current = current->next;
delete [] old;
}
head->next = tail;
tail->prev = head;
}
//head ÀÇ ´ÙÀ½ ³ëµåÀÇ °ªÀ» ¾ò°í ±× ³ëµå¸¦ »èÁ¦ÇÑ´Ù.
template<class T>
void Queue::Remove(T* buffer)
{
if(head->next == tail)
{
printf("\nError :: Remove Function");
return;
}
Node* temp;
temp = head->next;
*buffer = temp->data;
//head ÀÇ ´ÙÀ½´ÙÀ½ ³ëµå¿Í ¿¬°áÇϰí ÀÖ´Ù.
head->next = temp->next;
temp->next->prev = head;
tail->prev=tail->prev->prev;
delete [] temp;
}
struct POINT
{
int x;
int y;
};
void main(void)
{
POINT pt[5] = {1,1,2,2,3,3,4,4,5,5};
Queue queue;
for(int i=0; i<5; i++)
{
queue.Push(&pt[i]);
}
POINT temp;
// queue.RemoveAll();
for(int j=0; j<5; j++)
{
queue.Get(&temp,j);
printf("\n%d %d",temp.x, temp.y);
}
}
#endif //class Queue
|