// f_project.cpp : ÄÜ¼Ö ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÁøÀÔÁ¡À» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include "string.h" #include "stdlib.h" //°è»ê±â ÇÁ·Î±×·¥ #define MAX 100 char tokendata[MAX][20]; char ptoken[MAX][20]; int arr[20]; int cop = 0; int co; typedef struct link { char value; } link; typedef struct link2 { int value; } link2; link queue[MAX]; //Å¥ link list[MAX]; //¿¬»êÀÚ ½ºÅà link2 list2[MAX]; //½ºÅà int Top = -1; int front =0, rear = 0; void sinsert(char number) { Top++; if(Top == MAX) { printf("´õÀÌ»óÀÇ °ø°£ÀÌ ¾ø½À´Ï´Ù.\n"); return; } list[Top].value = number; } void sdelete() { char temp; if(Top == -1 ) { printf("Next Value is NULL"); return ; } temp = list[Top].value; Top --; } void sinsert2(int number) { Top++; if(Top == MAX) { printf("´õÀÌ»óÀÇ °ø°£ÀÌ ¾ø½À´Ï´Ù.\n"); return; } list2[Top].value = number; } void sdelete2() { int temp; if(Top == -1 ) { printf("Next Value is NULL"); return ; } temp = list2[Top].value; Top --; } void qinsert(int number) { rear = (rear + 1) % MAX; if(front ==rear) printf("´õÀÌ»ó »ðÀÔ ÇÒ ¼ö ¾ø½À´Ï´Ù.\n"); queue[rear].value = number; } void qdelete() { int temp; if(front ==rear) printf("»èÁ¦ÇÒ µ¥ÀÌÅÍ°¡ ¾ø½À´Ï´Ù.\n"); front = (front+1) % MAX; temp = queue[front].value ; } void gettoken() { int k = 0; co = 0; int coi = 0; char token[10]; char inputString[MAX]; printf("°è»ê½ÄÀ» ÀÔ·ÂÇϼ¼¿ä.\n"); while(1) { char ch = getchar(); if (ch == 10) break; inputString[k++] = ch; } inputString[k] = '\0'; int sLen = strlen(inputString); for(int i = 0; i < sLen ; i++) { if(i == sLen-1) { if(coi != 0) { token[coi] = '\0'; strcpy(tokendata[co++], token); } tokendata[co][0] = inputString[i]; break; } else if(inputString[i] == ' ') { continue; } else if(inputString[i]=='*'||inputString[i]=='/'||inputString[i]=='+'||inputString[i]=='-'||inputString[i]=='('||inputString[i]==')') { if(coi != 0) { token[coi] = '\0'; strcpy(tokendata[co++], token); } for( ; coi > 0 ; coi--) { token[coi-1] = '\0'; } tokendata[co++][0] = inputString[i]; continue; } else { token[coi++] = inputString[i]; } } } //ÈÄÀ§Ç¥±â½Ä º¯È¯ void postfix() //ptoken¹è¿­¿¡ ÈÄÀ§½ÄÀúÀå { int gcount = 0; cop = 0; for(int i = 0; i <= co ; i++) { if(tokendata[i][0] == '+' || tokendata[i][0] == '-') //´õÇϱâ¿Í »©±â ¿¬»êó¸® { if(Top == -1 || list[Top-1].value == '(') { sinsert(tokendata[i][0]); continue; } else if(gcount == 0) //°¡·Î ¾È¿¡ ¾øÀ»¶§ { for( ;Top > -1; ) { ptoken[cop++][0] = list[Top].value; sdelete(); } } else //°¡·Î ¾È¿¡ ÀÖÀ»¶§ { for( ;list[Top].value != '('; ) { ptoken[cop++][0] = list[Top].value; sdelete(); } } sinsert(tokendata[i][0]); } else if(tokendata[i][0] == '*' || tokendata[i][0] == '/') // °ö¼À°ú ³ª´°¼À ¿¬»êó¸® { // °¡·ÎÁß°£¿¡ °öÇϱ⠳ª¿À´Â °æ¿ì»ý°¢Çϱâ if(list[Top].value == '*' || list[Top].value == '/') { ptoken[cop++][0] = list[Top].value; sdelete(); sinsert(tokendata[i][0]); continue; } sinsert(tokendata[i][0]); } else if(tokendata[i][0] == '(' || tokendata[i][0] == ')')// °¡·Î °¡ÁßÄ¡ ó¸® { if(tokendata[i][0] == '(') { gcount++; sinsert(tokendata[i][0]); } else if(tokendata[i][0] == ')')//°¡·Î¾È¿¡ ³²Àº¿¬»êÀÚ ¸ðµÎ Ãâ·Â { gcount--; for( ;list[Top].value != '('; ) { ptoken[cop++][0] = list[Top].value; sdelete(); } sdelete(); } } else //¼ýÀÚ µéÀº ÈÄÀ§Ç¥±â½Ä ¹Ù·Î ÀúÀå strcpy(ptoken[cop++], tokendata[i]); if(i == co) // ÈÄÀ§½ÄÁ¾·á { for( ;Top > -1;) { ptoken[cop++][0] = list[Top].value; sdelete(); } break; } } } //ÈÄÀ§ Ç¥±â½Ä ¿¬»ê void operation() { int acount = 0; for(int i = 0; i < cop ; i++) { int rtemp = 0; if(ptoken[i][0] >= '0' && ptoken[i][0] <= '9')//¹®ÀÚ ºñ±³ ¼ýÀÚ¸é ¹è¿­¿¡ ³Ö°í ¾Æ´Ï¸é ¿¬»ê { rtemp = atoi(ptoken[i]); sinsert2(rtemp); } else { if(ptoken[i][0]=='*') rtemp = list2[Top -1].value * list2[Top].value; else if(ptoken[i][0]=='/') rtemp = list2[Top -1].value / list2[Top].value; else if(ptoken[i][0]=='-') rtemp = list2[Top -1].value - list2[Top].value; else if(ptoken[i][0]=='+') rtemp = list2[Top -1].value + list2[Top].value; sdelete2(); sdelete2(); sinsert2(rtemp); } } } int _tmain(int argc, _TCHAR* argv[]) { gettoken(); postfix(); operation(); printf("ÈÄÀ§Ç¥±â½Ä : "); for(int i = 0 ; i < cop ; i++) printf("%s ",ptoken[i]); printf("\n°á°ú°ª : %d", list2[0]); return 0; }