#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//해더파일 추가함!
typedef enum { lparen, rparen, plus, minus, times, devide, mod, eos, operand} precedence; //구조체 생성!
char expr[ 10 ] = { '6' , '2' , '/' , '3' , '-' , '4' , '2' , '*' , '+' , ':' , } ; //배열을 사용하여 계산하고자 하는 수식을 입력
int stack[ MAX] ; //stack을 선언
int stackTop = - 1 ; //Top값을 초기화
const int maxStackSize = MAX; //maxStackSize를 MAX값으로 지정
int pop ( ) ; // pop 함수 선언!
void push( int value) ; // 변수 value로 돌리는 함수 push를 선언
precedence getToken( char * symbol, int * n) ; //미리 선언한 구조체 함수 선언
int main( ) { //main함수 시작
int i, result; //변수 선언
for ( i= 0 ; i< maxStackSize; i++ ) //Stack의 사이즈 만큼 반복문을 돌림
stack[ i] = 0 ; //stack 초기화
for ( i= 0 ; i< 9 ; i++ )
// expr[]
result = eval( ) ; //eval()함수의 return값을 return함
printf ( "Expression result is %d.\n " , result
) ; return 0 ;
}
int pop( ) { //stack에서 빼는 함수
int topValue;
if ( stackTop < 0 ) {
}
else {
topValue = stack[ stackTop] ;
stackTop --;
}
return topValue;
}
void push ( int value) { //stack에 넣는 함수
if ( stackTop == maxStackSize - 1 ) {
}
else {
stackTop++;
stack[ stackTop] = value;
}
}
precedence getToken ( char * symbol, int * n) { // return값을 통해 stack에서 받아온 기호가 피연산자인지, 연산자인지, 어떤 연산자인지 알려주는 함수.
* symbol = expr[ ( * n) ++ ] ;
switch ( * symbol) {
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '/' : return devide;
case '*' : return times;
case '%' : return mod;
case ';' : return eos;
default : return operand;
}
}
int eval ( void ) { //들어온 문자가 부호인지, 숫자인지 판별
precedence token;
char symbol;
int op1, op2;
int n = 0 ;
token = getToken ( & symbol, & n) ;
while ( token != eos) {
if ( token == operand)
push ( symbol- '0' ) ; //어떤 문자로 된 기호에서 0을 빼서 숫자로 만들어주는 작업. 기호가 들어가는 경우, stack에서 숫자 2개를 빼서 각각 기호에 맞게 연산함.
else {
op2 = pop ( ) ; //처음 나온 값을 2번째라 이름 붙인다. 문자가 입,출력 되는 과정에서 순번이 뒤바뀌기 때문에 정정해주는 것이다.
op1 = pop ( ) ;
switch ( token) { //연산자에 따라 알맞은 연산을 하도록 선언
case plus: push( op1+ op2) ; break ;
case minus: push( op1- op2) ; break ;
case times: push( op1* op2) ; break ;
case devide: push( op1/ op2) ; break ;
case mod: push( op1% op2) ; break ;
}
}
token = getToken( & symbol, & n) ;
}
return pop( ) ;
}
precedence getToken( char * symbol, int * n) {
* symbol = expr[ ( * n) ++ ] ;
switch ( * symbol) {
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '/' : return devide;
case '*' : return times;
case '%' : return mod;
case ';' : return eos;
default : return operand;
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBNQVggMTAwCgovL+2VtOuNlO2MjOydvCDstpTqsIDtlaghCgp0eXBlZGVmIGVudW0ge2xwYXJlbiwgcnBhcmVuLCBwbHVzLCBtaW51cywgdGltZXMsIGRldmlkZSwgbW9kLCBlb3MsIG9wZXJhbmR9IHByZWNlZGVuY2U7CS8v6rWs7KGw7LK0IOyDneyEsSEKCmNoYXIgZXhwclsxMF0gPSB7JzYnLCcyJywnLycsJzMnLCctJywnNCcsJzInLCcqJywnKycsJzonLH07CS8v67Cw7Je07J2EIOyCrOyaqe2VmOyXrCDqs4TsgrDtlZjqs6DsnpAg7ZWY64qUIOyImOyLneydhCDsnoXroKUKaW50IHN0YWNrW01BWF07CS8vc3RhY2vsnYQg7ISg7Ja4CmludCBzdGFja1RvcCA9IC0xOwkvL1RvcOqwkuydhCDstIjquLDtmZQKY29uc3QgaW50IG1heFN0YWNrU2l6ZSA9IE1BWDsJLy9tYXhTdGFja1NpemXrpbwgTUFY6rCS7Jy866GcIOyngOyglQoKaW50IHBvcCAoKTsJLy8gcG9wIO2VqOyImCDshKDslrghCnZvaWQgcHVzaChpbnQgdmFsdWUpOwkvLyDrs4DsiJggdmFsdWXroZwg64+M66as64qUIO2VqOyImCBwdXNo66W8IOyEoOyWuApwcmVjZWRlbmNlIGdldFRva2VuKGNoYXIgKnN5bWJvbCwgaW50ICpuKTsJCS8v66+466asIOyEoOyWuO2VnCDqtazsobDssrQg7ZWo7IiYIOyEoOyWuAoKaW50IG1haW4oKXsJLy9tYWlu7ZWo7IiYIOyLnOyekQoJaW50IGksIHJlc3VsdDsJLy/rs4DsiJgg7ISg7Ja4CgoJZm9yKGk9MDsgaTxtYXhTdGFja1NpemU7IGkrKykJLy9TdGFja+ydmCDsgqzsnbTspogg66eM7YG8IOuwmOuzteusuOydhCDrj4zrprwKCQlzdGFja1tpXSA9IDA7CS8vc3RhY2sg7LSI6riw7ZmUCgoJcHJpbnRmKCJFeHByZXNzaW9uIDogIik7Cglmb3IgKGk9MDsgaTw5OyBpKyspCgkJcHJpbnRmKCIlYyAiLCBleHByW2ldKTsKCXByaW50ZigiXG4iKTsKCS8vIGV4cHJbXQoKCXJlc3VsdCA9IGV2YWwoKTsJLy9ldmFsKCntlajsiJjsnZggcmV0dXJu6rCS7J2EIHJldHVybu2VqAoJcHJpbnRmKCJFeHByZXNzaW9uIHJlc3VsdCBpcyAlZC5cbiIsIHJlc3VsdCk7CglzeXN0ZW0oInBhdXNlIik7CglyZXR1cm4gMDsKfQoKaW50IHBvcCgpIHsJLy9zdGFja+yXkOyEnCDrubzripQg7ZWo7IiYCglpbnQgdG9wVmFsdWU7CgoJaWYoc3RhY2tUb3AgPCAwKSB7CgkJcHJpbnRmKCJTdGFjayBpcyBlbXB0eSFcbiIpOwoJCWV4aXQoMCk7Cgl9CgllbHNlewoJCXRvcFZhbHVlID0gc3RhY2tbc3RhY2tUb3BdOwoJCXN0YWNrVG9wIC0tOwoJfQoJcmV0dXJuIHRvcFZhbHVlOwp9Cgp2b2lkIHB1c2ggKGludCB2YWx1ZSkgewkvL3N0YWNr7JeQIOuEo+uKlCDtlajsiJgKCWlmKHN0YWNrVG9wID09IG1heFN0YWNrU2l6ZSAtMSkgewoJCXByaW50ZigiU3RhY2sgaXMgZnVsbCFcbiIpOwoJCWV4aXQoMCk7Cgl9CgllbHNlewoJCXN0YWNrVG9wKys7CgkJc3RhY2tbc3RhY2tUb3BdID0gdmFsdWU7Cgl9Cn0KCnByZWNlZGVuY2UgZ2V0VG9rZW4gKGNoYXIgKnN5bWJvbCwgaW50ICpuKSB7CS8vIHJldHVybuqwkuydhCDthrXtlbQgc3RhY2vsl5DshJwg67Cb7JWE7JioIOq4sO2YuOqwgCDtlLzsl7DsgrDsnpDsnbjsp4AsIOyXsOyCsOyekOyduOyngCwg7Ja065akIOyXsOyCsOyekOyduOyngCDslYzroKTso7zripQg7ZWo7IiYLgoJKnN5bWJvbCA9IGV4cHJbKCpuKSsrXTsKCXN3aXRjaCAoKnN5bWJvbCkgewoJY2FzZSAnKCcgOiByZXR1cm4gbHBhcmVuOwoJY2FzZSAnKScgOiByZXR1cm4gcnBhcmVuOwoJY2FzZSAnKycgOiByZXR1cm4gcGx1czsKCWNhc2UgJy0nIDogcmV0dXJuIG1pbnVzOwoJY2FzZSAnLycgOiByZXR1cm4gZGV2aWRlOwoJY2FzZSAnKicgOiByZXR1cm4gdGltZXM7CgljYXNlICclJyA6IHJldHVybiBtb2Q7CgljYXNlICc7JyA6IHJldHVybiBlb3M7CglkZWZhdWx0IDogcmV0dXJuIG9wZXJhbmQ7Cgl9Cn0KCmludCBldmFsICh2b2lkKSB7CS8v65Ok7Ja07JioIOusuOyekOqwgCDrtoDtmLjsnbjsp4AsIOyIq+yekOyduOyngCDtjJDrs4QKCXByZWNlZGVuY2UgdG9rZW47CgljaGFyIHN5bWJvbDsKCWludCBvcDEsIG9wMjsKCWludCBuID0gMDsKCXRva2VuID0gZ2V0VG9rZW4gKCZzeW1ib2wsICZuKTsKCXdoaWxlICh0b2tlbiAhPSBlb3MpIHsKCQlpZiAodG9rZW4gPT0gb3BlcmFuZCkKCQkJcHVzaCAoc3ltYm9sLScwJyk7CS8v7Ja065akIOusuOyekOuhnCDrkJwg6riw7Zi47JeQ7IScIDDsnYQg67m87IScIOyIq+yekOuhnCDrp4zrk6TslrTso7zripQg7J6R7JeFLiDquLDtmLjqsIAg65Ok7Ja06rCA64qUIOqyveyasCwgc3RhY2vsl5DshJwg7Iir7J6QIDLqsJzrpbwg67m87IScIOqwgeqwgSDquLDtmLjsl5Ag66ee6rKMIOyXsOyCsO2VqC4KCQllbHNlIHsKCQkJb3AyID0gcG9wICgpOwkvL+yymOydjCDrgpjsmKgg6rCS7J2EIDLrsojsp7jrnbwg7J2066aEIOu2meyduOuLpC4g66y47J6Q6rCAIOyehSzstpzroKUg65CY64qUIOqzvOygleyXkOyEnCDsiJzrsojsnbQg65Kk67CU64CM6riwIOuVjOusuOyXkCDsoJXsoJXtlbTso7zripQg6rKD7J2064ukLgoJCQlvcDEgPSBwb3AgKCk7CgkJCXN3aXRjaCh0b2tlbikgewkvL+yXsOyCsOyekOyXkCDrlLDrnbwg7JWM66ee7J2AIOyXsOyCsOydhCDtlZjrj4TroZ0g7ISg7Ja4CgkJCQljYXNlIHBsdXM6IHB1c2gob3AxK29wMik7IGJyZWFrOwoJCQkJY2FzZSBtaW51czogcHVzaChvcDEtb3AyKTsgYnJlYWs7CgkJCQljYXNlIHRpbWVzOiBwdXNoKG9wMSpvcDIpOyBicmVhazsKCQkJCWNhc2UgZGV2aWRlOiBwdXNoKG9wMS9vcDIpOyBicmVhazsKCQkJCWNhc2UgbW9kOiBwdXNoKG9wMSVvcDIpOyBicmVhazsKCQkJfQoJCX0KCQl0b2tlbiA9IGdldFRva2VuKCZzeW1ib2wsICZuKTsKCX0KCXJldHVybiBwb3AoKTsKfQpwcmVjZWRlbmNlIGdldFRva2VuKGNoYXIgKnN5bWJvbCwgaW50ICpuKSB7Cgkqc3ltYm9sID0gZXhwclsoKm4pKytdOwoJc3dpdGNoICgqc3ltYm9sKSB7CgljYXNlICcoJyA6IHJldHVybiBscGFyZW47CgljYXNlICcpJyA6IHJldHVybiBycGFyZW47CgljYXNlICcrJyA6IHJldHVybiBwbHVzOwoJY2FzZSAnLScgOiByZXR1cm4gbWludXM7CgljYXNlICcvJyA6IHJldHVybiBkZXZpZGU7CgljYXNlICcqJyA6IHJldHVybiB0aW1lczsKCWNhc2UgJyUnIDogcmV0dXJuIG1vZDsKCWNhc2UgJzsnIDogcmV0dXJuIGVvczsKCWRlZmF1bHQgOiByZXR1cm4gb3BlcmFuZDsKCX0KfQ==
compilation info
prog.c: In function 'main':
prog.c:30:11: warning: implicit declaration of function 'eval' [-Wimplicit-function-declaration]
result = eval(); //eval()함수의 return값을 return함
^
prog.c: In function 'eval':
prog.c:88:4: warning: enumeration value 'lparen' not handled in switch [-Wswitch]
switch(token) { //연산자에 따라 알맞은 연산을 하도록 선언
^
prog.c:88:4: warning: enumeration value 'rparen' not handled in switch [-Wswitch]
prog.c:88:4: warning: enumeration value 'eos' not handled in switch [-Wswitch]
prog.c:88:4: warning: enumeration value 'operand' not handled in switch [-Wswitch]
prog.c: At top level:
prog.c:100:12: error: redefinition of 'getToken'
precedence getToken(char *symbol, int *n) {
^
prog.c:61:12: note: previous definition of 'getToken' was here
precedence getToken (char *symbol, int *n) { // return값을 통해 stack에서 받아온 기호가 피연산자인지, 연산자인지, 어떤 연산자인지 알려주는 함수.
^
stdout