´ÙÀ½ ¿¹Á¦´Â 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¸¦ ¼±¾ðÇؼ »ç¿ëÇÏ°í ÀÖ´Ù. µÎ ÇÔ¼ö°¡ °¢°¢ ŸÀÔÀÌ ´Ù¸¥ ½ºÅÃÀ» ¸¸µé¾î »ç¿ëÇÏÁö¸¸ Ŭ·¡½º°¡ ÅÛÇø´À¸·Î ¼±¾ðµÇ¾î ÀÖÀ¸¹Ç·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ÇÊ¿äÇÏ´Ù¸é ¾ó¸¶µçÁö ¸¹Àº ŸÀÔ¿¡ ´ëÇØ ½ºÅÃÀ» ¸¸µé¾î ¾µ ¼ö ÀÖÀ» °ÍÀÌ´Ù.