31-3-³ª.TStack

´ÙÀ½ ¿¹Á¦´Â 19Àå¿¡¼­ ÀÛ¼ºÇß´ø Á¤¼öÇü ½ºÅÃÀ» Ŭ·¡½º·Î ¸¸µç °ÍÀÌ´Ù. ½ºÅÃÀ» Ç¥ÇöÇϴµ¥ ÇÊ¿äÇÑ Á¤¼öÇü ¹è¿­°ú ¹è¿­ Å©±â, ½ºÅà Æ÷ÀÎÅÍ µîÀ» ¸â¹ö º¯¼ö·Î Æ÷ÇÔ½ÃÅ°°í Push, Pop µîÀÇ ±âº» µ¿ÀÛÀº ¸â¹ö ÇÔ¼ö·Î ±¸ÇöÇß´Ù. ½ºÅÃÀ» ÃʱâÈ­ÇÏ´Â ±â´ÉÀº »ý¼ºÀÚ¿¡ ÀÛ¼ºÇÏ°í ÇØÁ¦ÇÏ´Â ÄÚµå´Â Æı«ÀÚ¿¡ µÎ¸é µÈ´Ù.

 

¿¹ Á¦ : iStack

#include <Turboc.h>

 

class iStack

{

private:

     int *Stack;

     int Size;

     int Top;

 

public:

     iStack(int aSize) {

          Size=aSize;

          Stack=(int *)malloc(Size*sizeof(int));

          Top=-1;

     }

     virtual ~iStack() {

          free(Stack);

     }

     virtual BOOL Push(int data) {

          if (Top < Size-1) {

              Top++;

              Stack[Top]=data;

              return TRUE;

          } else {

              return FALSE;

          }

     }

     virtual int Pop() {

          if (Top >= 0) {

              return Stack[Top--];

          } else {

              return -1;

          }

     }

};

 

void main()

{

     iStack iS(256);

     iS.Push(7);

     iS.Push(0);

     iS.Push(6);

     iS.Push(2);

     iS.Push(9);

     printf("%d\n",iS.Pop());

     printf("%d\n",iS.Pop());

     printf("%d\n",iS.Pop());

     printf("%d\n",iS.Pop());

     printf("%d\n",iS.Pop());

}

 

½ºÅÃÀÌ ÇÊ¿äÇÒ ¶§´Â iStack Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇϴµ¥ Àμö·Î ½ºÅÃÀÇ Å©±â¸¸ ¹àÈ÷¸é ³ª¸ÓÁö ÇÊ¿äÇÑ ÃʱâÈ­´Â »ý¼ºÀÚ¿¡¼­ ÇÑ´Ù. ±×¸®°í Push, Pop µîÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ½ºÅÃÀ» Æí¸®ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ù »ç¿ëÇÑ ½ºÅÃÀº Æı«ÀÚ¿¡¼­ Á¤¸®ÇϹǷΠº°µµÀÇ ÇØÁ¦¸¦ ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

µ¿ÀÛ¿¡ ÇÊ¿äÇÑ Çʼö ¸â¹öµéÀÌ ÇÑ Å¬·¡½º¿¡ ĸ½¶È­µÇ¾î ÀÖÀ¸¹Ç·Î È®½ÇÈ÷ »ç¿ëÇϱ⿡´Â Æí¸®ÇÏ´Ù. ±×·¯³ª ¾ÆÁ÷ ŸÀÔ¿¡ ´ëÇÑ Á¾¼Ó¼ºÀ» ÇØ°áÇÏÁö´Â ¸øÇߴµ¥ iStackÀº Á¤¼öÇü °ª¸¸ ÀúÀåÇÒ ¼ö ÀÖÀ» »ÓÀ̸ç doubleÀ̳ª char ÇüÀ» ÀúÀåÇÒ ¼ö´Â ¾ø´Ù. ´Ù¸¥ ŸÀÔ¿¡ ´ëÇÑ ½ºÅÃÀ» ¸¸µé·Á¸é iStackÀÇ ÀϺθ¦ ¼öÁ¤ÇØ¾ß Çϴµ¥ Stack ¸â¹öÀÇ Å¸ÀÔ, PushÀÇ Àμö, PopÀÇ ¸®ÅÏ Å¸ÀÔ Á¤µµ¸¸ ¹Ù²Ù¸é µÈ´Ù. ŸÀÔ¸¸ º¯°æµÉ »Ó ¾Ë°í¸®ÁòÀº µ¿ÀÏÇϹǷΠÅÛÇø´À» »ç¿ëÇϸé ÀÓÀÇ Å¸ÀÔÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù.

19Àå¿¡¼­ ½Ç¼öÇü ½ºÅðú ¹®ÀÚÇü ½ºÅÃÀ» »ç¿ëÇÏ¿© ¼ö½ÄÀ» °è»êÇÏ´Â TextCalc ¿¹Á¦¸¦ ¸¸µé¾î º» ÀûÀÌ Àִµ¥ Àß µ¿ÀÛÇϱâ´Â ÇÏÁö¸¸ ¶È°°Àº ³í¸®¸¦ »ç¿ëÇÏ´Â ½ºÅÃÀÌ µÎ Ä«ÇÇ Á¸ÀçÇÑ´Ù´Â Á¡ÀÌ ¹«Ã´ ºÒÇÕ¸®ÇØ º¸ÀδÙ. ´ÜÁö ŸÀÔ¸¸ ´Ù¸¦ »ÓÀε¥ À̰͵éÀ» Çϳª·Î ÇÕÄ¥ ¼ö°¡ ¾ø´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ÄÚµåÀÇ ¾çÀÌ ¸¹¾ÆÁö´Â °ÍÀº ¹°·ÐÀÌ°í ±â´ÉÀ» È®ÀåÇÒ ¶§µµ ÀÏÀÏÀÌ µÎ ±ºµ¥¸¦ °íÃÄ¾ß ÇϹǷΠÀ¯ÁöÇϱⰡ ¾ÆÁÖ ¾î·Á¿öÁø´Ù. ÅÛÇø´À» »ç¿ëÇÏ¿© ½ºÅà Çϳª·Î µÎ °¡Áö ŸÀÔÀ» Áö¿øÇϵµ·Ï ¼öÁ¤ÇØ º¸ÀÚ. ¸ÕÀú ½ºÅà Ŭ·¡½º ÅÛÇø´À» Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù.

 

¿¹ Á¦ : TStack.h

template<typename T>

class TStack

{

protected:

     T *Stack;

     int Size;

     int Top;

 

public:

     TStack(int aSize) {

          Size=aSize;

          Stack=(T *)malloc(Size*sizeof(T));

          Top=-1;

     }

     virtual ~TStack() {

          free(Stack);

     }

     virtual BOOL Push(T data) {

          if (Top < Size-1) {

              Top++;

              Stack[Top]=data;

              return TRUE;

          } else {

              return FALSE;

          }

     }

     virtual T Pop() {

          return Stack[Top--];

     }

     virtual int GetTop() { return Top; }

     virtual T GetValue(int n) { return Stack[n]; }

};

 

ÅÛÇø´ ±â¹ÝÀ¸·Î ¼öÁ¤ÇßÀ¸¹Ç·Î À̸§À» TStackÀ̶ó°í Áö¾úÀ¸¸ç ½ºÅÿ¡ ÀúÀåÇÒ Å¸ÀÔÀ» Àμö¿­·Î Àü´Þ¹Þ´Â´Ù. ¸â¹ö ÇÔ¼öÀÇ ³í¸®´Â ¾ÕÀÇ iStack ¿¹Á¦¿Í µ¿ÀÏÇϸç int°¡ µé¾î°¡¾ß ÇÒ À§Ä¡¿¡ T°¡ ´ë½Å µé¾î°¬À» »ÓÀÌ´Ù. ¸î °¡Áö Â÷ÀÌÁ¡µµ Àִµ¥ ¿ì¼± ¿¡·¯ 󸮸¦ À§ÇØ Top À§Ä¡¸¦ Á¶»çÇÏ´Â GetTop ¸â¹ö ÇÔ¼ö¿Í ¿ì¼± ¼øÀ§ Á¶»ç¸¦ À§ÇØ ÁöÁ¤ÇÑ À§Ä¡ÀÇ °ªÀ» »èÁ¦ÇÏÁö´Â ¾Ê°í Àб⸸ ÇÏ´Â GetValue ÇÔ¼ö°¡ Ãß°¡µÇ¾ú´Ù.

±×¸®°í Pop ÇÔ¼öÀÇ ¿¡·¯ ó¸® Äڵ尡 »èÁ¦µÇ¾ú´Âµ¥ ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇØ µ¿ÀÛÇϱâ À§Çؼ­´Â -1À» ¸®ÅÏÇÏ´Â ´Ü¼øÇÑ ¹æ¹ýÀ» ¾µ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. -1À̶ó´Â ƯÀÌ°ªÀº ¼öÄ¡Çü¿¡¸¸ Á¸ÀçÇϹǷΠ½ºÅÿ¡ °´Ã¼¸¦ ÀúÀåÇÒ ¶§´Â ¿¡·¯¸¦ ó¸®ÇÏ´Â ´Ù¸¥ ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. ½ºÅÿ¡ ¾Æ¹« °Íµµ ¾ø´Â »óÅ¿¡¼­ popÀ» È£ÃâÇÏ´Â °ÍÀº ºÐ¸íÇÑ ³í¸®Àû ¿¡·¯À̹ǷΠassert¸¦ ¾²´Â °ÍÀÌ °¡Àå ÇÕ¸®ÀûÀÌ´Ù. ÀÌ ÅÛÇø´ÀÌ Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö °è»ê±â ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

¿¹ Á¦ : TextCalcTemplate

#include <Turboc.h>

#include <math.h>

#include "TStack.h"

 

int GetPriority(int op)

{

     switch (op) {

     case '(':

          return 0;

     case '+':

     case '-':

          return 1;

     case '*':

     case '/':

          return 2;

     case '^':

          return 3;

     }

     return 100;

}

 

void MakePostfix(char *Post, const char *Mid)

{

     const char *m=Mid;

     char *p=Post,c;

     TStack<char> cS(256);

 

     while (*m) {

          // ¼ýÀÚ - ±×´ë·Î Ãâ·ÂÇÏ°í µÚ¿¡ °ø¹é Çϳª¸¦ Ãâ·ÂÇÑ´Ù.

          if (isdigit(*m)) {

              while (isdigit(*m) || *m=='.') *p++=*m++;

              *p++=' ';

          } else

          // ¿¬»êÀÚ - ½ºÅÿ¡ ÀÖ´Â Àڱ⺸´Ù ³ôÀº ¿¬»êÀÚ¸¦ ¸ðµÎ ²¨³» Ãâ·ÂÇÏ°í ÀÚ½ÅÀº Ǫ½ÃÇÑ´Ù.

          if (strchr("^*/+-",*m)) {

              while (cS.GetTop()!=-1 && GetPriority(cS.GetValue(cS.GetTop())) >=

                   GetPriority(*m)) {

                   *p++=cS.Pop();

              }

              cS.Push(*m++);

          } else

          // ¿©´Â °ýÈ£ - Ǫ½ÃÇÑ´Ù.

          if (*m=='(') {

              cS.Push(*m++);

          } else

          // ´Ý´Â °ýÈ£ - ¿©´Â °ýÈ£°¡ ³ª¿Ã ¶§±îÁö ÆËÇؼ­ Ãâ·ÂÇÏ°í ¿©´Â °ýÈ£´Â ¹ö¸°´Ù.

          if (*m==')') {

              for (;;) {

                   c=cS.Pop();

                   if (c=='(') break;

                   *p++=c;

              }

              m++;

          } else {

              m++;

          }

     }

     // ½ºÅÿ¡ ³²Àº ¿¬»êÀÚµé ¸ðµÎ ²¨³½´Ù.

     while (cS.GetTop() != -1) {

          *p++=cS.Pop();

     }

     *p=0;

}

 

double CalcPostfix(const char *Post)

{

     const char *p=Post;

     double num;

     double left,right;

     TStack<double> dS(256);

 

     while (*p) {

          // ¼ýÀÚ´Â ½ºÅÿ¡ ³Ö´Â´Ù.

          if (isdigit(*p)) {

              num=atof(p);

              dS.Push(num);

              for(;isdigit(*p) || *p=='.';p++) {;}

          } else {

              // ¿¬»êÀÚ´Â ½ºÅÿ¡¼­ µÎ ¼ö¸¦ ²¨³» ¿¬»êÇÏ°í ´Ù½Ã Çª½ÃÇÑ´Ù.

              if (strchr("^*/+-",*p)) {

                   right=dS.Pop();

                   left=dS.Pop();

                   switch (*p) {

                   case '+':

                        dS.Push(left+right);

                        break;

                   case '-':

                        dS.Push(left-right);

                        break;

                   case '*':

                        dS.Push(left*right);

                        break;

                   case '/':

                        if (right == 0.0) {

                             dS.Push(0.0);

                        } else {

                             dS.Push(left/right);

                        }

                        break;

                   case '^':

                        dS.Push(pow(left,right));

                        break;

                   }

              }

              // ¿¬»ê ÈÄ ¶Ç´Â ¿¬»êÀÚ°¡ ¾Æ´Ñ °æ¿ì ´ÙÀ½ ¹®ÀÚ·Î

              p++;

          }

     }

     if (dS.GetTop() != -1) {

          num=dS.Pop();

     } else {

          num=0.0;

     }

     return num;

}

 

double CalcExp(const char *exp,BOOL *bError=NULL)

{

     char Post[256];

     const char *p;

     int count;

    

     if (bError!=NULL) {

          for (p=exp,count=0;*p;p++) {

              if (*p=='(') count++;

              if (*p==')') count--;

          }

          *bError=(count != 0);

     }

 

     MakePostfix(Post,exp);

     return CalcPostfix(Post);

}

 

void main()

{

     char exp[256];

     BOOL bError;

     double result;

 

     char *p=strchr("^*/+-",NULL);

     strcpy(exp,"2.2+3.5*4.1");printf("%s = %.2f\n",exp,CalcExp(exp));

     strcpy(exp,"(34+93)*2-(43/2)");printf("%s = %.2f\n",exp,CalcExp(exp));

     strcpy(exp,"1+(2+3)/4*5+2^10+(6/7)*8");printf("%s = %.2f\n",exp,CalcExp(exp));

 

     for (;;) {

          printf("¼ö½ÄÀ» ÀÔ·ÂÇϼ¼¿ä(³¡³¾ ¶§ 0) : ");

          gets(exp);

          if (strcmp(exp,"0")==0) break;

          result=CalcExp(exp,&bError);

          if (bError) {

              puts("¼ö½ÄÀÇ °ýȣ¦ÀÌ Æ²¸³´Ï´Ù.");

          } else {

              printf("%s = %.2f\n",exp,result);

          }

     }

}

 

½ÇÇàÇØ º¸¸é Àß °è»êµÈ´Ù.

 

2.2+3.5*4.1 = 16.55

(34+93)*2-(43/2) = 232.50

1+(2+3)/4*5+2^10+(6/7)*8 = 1038.11

¼ö½ÄÀ» ÀÔ·ÂÇϼ¼¿ä(³¡³¾ ¶§ 0) : (1+2+3)*4

(1+2+3)*4 = 24.00

 

ÁßÀ§½ÄÀ» ÈÄÀ§½ÄÀ¸·Î º¯È¯ÇÏ´Â MakePostfix ÇÔ¼ö´Â ¹®ÀÚÇüÀÇ ½ºÅÃÀÌ ÇÊ¿äÇϹǷΠTStack<char> ŸÀÔÀÇ cS¸¦ 256Å©±â·Î ¼±¾ðÇؼ­ »ç¿ëÇÑ´Ù. ÀÌ ¼±¾ð¹®¿¡ ÀÇÇØ ÄÄÆÄÀÏ·¯´Â char ŸÀÔ¿¡ ´ëÇÑ ½ºÅà Ŭ·¡½º¸¦ ±¸Ã¼È­ÇÒ °ÍÀÌ´Ù. cS°¡ Áö¿ªº¯¼öÀ̹ǷΠÇÔ¼ö°¡ Á¾·áµÉ ¶§ ÀÚµ¿À¸·Î Æı«µÇ¸ç µû¶ó¼­ º°µµÀÇ Á¤¸® Äڵ带 ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

ÈÄÀ§½ÄÀ» ¿¬»êÇÏ´Â CalcPostfix ÇÔ¼ö´Â ¿¬»ê °úÁ¤ÀÇ Áß°£°ª ÀúÀåÀ» À§ÇØ ½Ç¼öÇü ½ºÅÃÀÌ ÇÊ¿äÇÏ´Ù. ±×·¡¼­ TStack<double> ŸÀÔÀÇ dS¸¦ ¼±¾ðÇؼ­ »ç¿ëÇÏ°í ÀÖ´Ù. µÎ ÇÔ¼ö°¡ °¢°¢ ŸÀÔÀÌ ´Ù¸¥ ½ºÅÃÀ» ¸¸µé¾î »ç¿ëÇÏÁö¸¸ Ŭ·¡½º°¡ ÅÛÇø´À¸·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ÇÊ¿äÇÏ´Ù¸é ¾ó¸¶µçÁö ¸¹Àº ŸÀÔ¿¡ ´ëÇØ ½ºÅÃÀ» ¸¸µé¾î ¾µ ¼ö ÀÖÀ» °ÍÀÌ´Ù.