디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

전수좀해줘라

ㅇㅇㅇ(121.124) 2010.10.13 00:00:37
조회 58 추천 0 댓글 1

infix -> postfix 소슨데

문자열 입력해서 계산하면 아스키코드값으로 계산되는데

근데 원하는게 아스키코드값말고 a=1, b=2 이런식으로 지정해주고 싶은데

어딜바꿔야되지 --







<요긴소스>

#include<stdio.h>
#include<stdlib.h>

#define max_stack_size 5 /*스택의 최대 크기*/
#define max_expr_size 5 /*수식의 최대 크기*/
typedef enum {lparen, rparen, plus, minus, times, divide, eos, operand} precedence;
static int isp[] = {0,19,12,12,13,13,0};
static int icp[] = {20,19,12,12,13,13,0};
int i=0; //후위 연산을 할때 쓸 char형 배열의 첨자
int top;
int stack_i[max_stack_size];
char expr[max_expr_size];
precedence stack_p[max_stack_size];

/* isp와 icp 배열 -- 인텍스는 연산자
  lparen,rparen,plus, minus,times,divide,eos의 우선순위 값 */

int eval(void);
precedence get_token(char *,int *);
void postfix(void );
print_token(precedence token);
add_p(int *,precedence );
add_i(int *,int );
int delete_top(int *);

////////////////////////////////전처리기 & 전역변수 & 프로토 타입///////////////
main(){

 printf("연산식을 입력하시오:");
 scanf("%s",expr);
 printf("infix(중위 연산자) : %s \\n",expr);
 printf("postfix(후위 연산자) : ");
 postfix();
 printf("\\n연산 \\n");
 eval();
 printf("답은 %d 입니다. ",stack_i[0]);

}
//stack_p=>char으로 받은 expr을 열거형으로 바꾼다. 그래서 피연산자(숫자)랑 연산자를 구분한다.
//////////////////////////중위 표기를 후위 표기로 변환하는 함수/////////////
void postfix(void)
{
 /*수식을 후위 표기식으로 출력한다. 수식 문자열, 스택, top은 전역적이다.*/
 char symbol;
 precedence token;
 int n=0;
 int top = 0; 
 stack_p[0] = eos;  /*eos를 스택에 넣는다.*/

 for(token = get_token(&symbol, &n); token != eos; token = get_token(&symbol,&n)){
  
  if(token == operand){
   expr[i++] = symbol;
   printf("%c",symbol);
  }

  else if (token == rparen){
   /*왼쪽괄호가 나올 때 까지 토큰들을 제거해서 출력시킴*/
   while(stack_p[top] != lparen)
     print_token(stack_p[delete_top(&top)]);
   
   delete_top(&top); /*좌괄호를 버린다.*/
  }  

  else{
  /*symbol의 isp가 token의 icp보다 크거나 같으면 symbol을 제거하고 출력시킴*/
   while( isp[stack_p[top]] >= icp[token] ){
    print_token(stack_p[top]);
    delete_top(&top);
   }

   add_p(&top, token);
  }

 }
 while( (token = stack_p[delete_top(&top)]) != \'\\0\' )
  print_token(token); 

}


//expr=>입력받을 시 char배열로 수를 받는다.
////////////////////////입력 문자열로 부터 토큰을 생성하는 함수//////////////
precedence get_token(char *symbol,int *n){

 /*다음 토큰을 취한다.
 symbol은 문자표현이며,
 token은 그것의 열거된 값으로 표현되고 명칭으로 반환된다.*/

 *symbol = expr[(*n)++];
 switch (*symbol){
 case \'(\' :
  return lparen;
 case \')\' :
  return rparen;
 case \'+\' :
  return plus;
 case \'-\' :
  return minus;
 case \'*\' :
  return times;
 case \'/\' :
  return divide;
 case \'\\0\' :
  return eos;
 default :
  return operand;
 }
}
///////////////////////////////////////////////////////////////////////////
add_i(int *top,int token){ stack_i[++*top]=token; }
add_p(int *top,precedence token){  stack_p[++*top]=token; }//push하는 함수
/////////////////////////////////////////////////////////////////////////
int delete_top(int *top){ return (*top)--; }//top만 감소
///////////////////////////////////////////////////////////////////////////
print_token(precedence token){//출력
 char temp;

 switch(token){
    case plus:
     expr[i++] = \'+\';

     printf("+");    
     break;

    case minus:
     expr[i++] = \'-\';

     printf("-");    
     break;

    case times:
     expr[i++] = \'*\';

     printf("*");
     break;

    case divide:
     expr[i++] = \'/\';

     printf("/");
     break;

    case eos:
     expr[i++] = \'\\0\';

     temp=\'\\0\';
     printf("%c",temp);
     break;       
   }
 return 0;
}

//열거형인 stack_p로 되어있는 것을 정수형인 stack_i로 바꾼다.
///////////////////////////후위 표기식을 연산하는 함수////////////////
int eval(void)
{
 /* 전역 변수로 되어 있는 후위 표기식 expr을 연산한다. \'/0\'은 수식의 끝을 나타낸다.
 stack과 top은 전역 변수이다. 함수 get_token은 토큰의 타입과 문자 심벌을 반환한다.
 피연산자는 한 문자로 된 숫자임을 가정한다.*/
 precedence token;
 char symbol;
 int op1,op2;
 int n = 0; /*수식 문자열을 위한 카운터*/
 int  top = -1; 

 token = get_token(&symbol,&n);
 
 while(token != eos){
  if(token == operand)   
   add_i(&top, symbol -\'0\');
  
  

  else{   
   /*두 피연산자를 삭제하여 연산을 수행한 후, 그 결과를 스택에 삽입함*/

   op2 = stack_i[delete_top(&top)]; /*스택 삭제*/
   op1 = stack_i[delete_top(&top)];

   switch(token){
    case plus:
     printf("%d %d + = %d\\n",op1,op2,op1+op2);
     add_i(&top,op1+op2);    
     break;

    case minus:
     printf("%d %d - = %d\\n",op1,op2,op1-op2);
     add_i(&top,op1-op2);     
     break;

    case times:
     printf("%d %d * = %d\\n",op1,op2,op1*op2);
     add_i(&top,op1*op2);
     break;

    case divide:
     printf("%d %d / = %d\\n",op1,op2,op1/op2);
     if(!op2){
      printf("불능");
      exit(1);
     }
     add_i(&top,op1/op2);
     break;
     
   }

  }
  token = get_token(&symbol,&n);
 }
 return delete_top(&top); /*결과를 반환*/
 
}

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인 안됐으면 어쩔 뻔, 누가 봐도 천상 연예인은? 운영자 24/06/17 - -
226132 제로보드4 스킨 문제 해결해주면 도토리 100개 준다 [5] (121.151) 10.12.21 103 0
226130 strtok 함수는 문자열 짜른뒤 뒤에있는 값이 null인가요? [2] 헤헤(203.252) 10.12.21 105 0
226129 테스트용으로 게임서버 돌려야하는데 좋은 호스팅 또는 호스팅 분양좀 [8] URA!갤로그로 이동합니다. 10.12.21 146 0
226128 컴공 지망중인데요...님들 글보니깐 선택에 고민이됩니다.. [6] 도미노(180.68) 10.12.21 188 0
226127 세계 최강의 오목 프로그램은 뭐냐? [1] z(218.93) 10.12.21 1017 0
226125 비쥬얼베이직 질문!! 돼지곰(115.95) 10.12.21 51 0
226124 지금 대학입시중인 고3이구요 컴공을 지망하는데..학원문제 답변좀 부탁드림 [10] 도미노(180.68) 10.12.21 145 0
226121 C할때 열혈강의가 좋나요//// [3] ㅇㅇ(124.3) 10.12.21 119 0
226118 이사람은 이름때문에 얼마나 힘든인생을 보냈을까... [3] 꿀레갤로그로 이동합니다. 10.12.21 150 0
226116 자바로 코딩했더니 씨언어 다 까먹었네요 [4] 마타버터갤로그로 이동합니다. 10.12.21 257 0
226115 개꿈을 꿨다 [3] 땡칠도사갤로그로 이동합니다. 10.12.21 106 0
226114 C++0x 람다를 쓰려면 최소한 이 정도는 해야지 않겠냐? [10] 명태향돌(110.15) 10.12.21 250 0
226113 customizing... 햏햏했갤로그로 이동합니다. 10.12.21 32 0
226112 C++0x [11] 뻘짓(121.182) 10.12.21 217 0
226111 오늘 민류 생일이야? [4] Minryu갤로그로 이동합니다. 10.12.21 157 0
226110 좋은아침입니다 [2] SKOTLEX갤로그로 이동합니다. 10.12.21 64 0
226109 iljeomobolt흉.. 이게 원본. [1] C초보(116.39) 10.12.21 60 0
226108 객체지향과 패턴을 활용한 달팽이 [1] 늅늅(202.136) 10.12.21 120 0
226107 으앜 고3때 접었던 수학 다시펼치려니 머리아프당... [4] 꿀레갤로그로 이동합니다. 10.12.21 113 0
226106 컴터 고수님들 이거 해결책좀 알려주셈요 [6] snakecutter갤로그로 이동합니다. 10.12.21 139 0
226104 iljeomobolt 흉.. 이게 내가 만든 원본이얌.. [15] c초보(116.39) 10.12.21 160 0
226103 질문이 있어요. [4] 머그컵갤로그로 이동합니다. 10.12.21 59 0
226102 펑션 만들기. 좀 도와줘욤 ㅠㅠ [5] C초보(116.39) 10.12.21 96 0
226101 으앍 정말 [5] 데스티갤로그로 이동합니다. 10.12.21 93 0
226100 분산해시테이블이나 RIP의 라우팅 테이블이나... [3] ㅁㄴㅇㄹ(175.200) 10.12.21 139 0
226099 i jenjang [6] 꿀레갤로그로 이동합니다. 10.12.21 64 0
226098 근데 왜 [7] elwlwlwk갤로그로 이동합니다. 10.12.21 83 0
226097 입갤과 동시에 딸국질 [7] elwlwlwk갤로그로 이동합니다. 10.12.21 110 0
226096 더블릿 달팽이 prismatic갤로그로 이동합니다. 10.12.21 83 0
226095 두부 먹고 싶다 [7] prismatic갤로그로 이동합니다. 10.12.21 80 0
226093 아주대 정컴 아시는분 [12] 룰루(58.121) 10.12.21 360 0
226092 님들 전 나중에 정보보안쪽에서 일하구싶은데 [24] 금고래갤로그로 이동합니다. 10.12.21 280 0
226091 와 진짜 내가 마그넷주소까지 쏴줄줄 몰랐네 진짜.. 그래서 이걸 준비.. [2] 형들아(220.73) 10.12.21 105 0
226090 님들 나중에 취업할려면 [2] 금고래갤로그로 이동합니다. 10.12.21 107 0
226088 형들 미안한데영. 공룡책 있잖아여. 그거 인터넷 다운받는데 어딘지 아셈? [4] 형들아(220.73) 10.12.21 199 0
226086 ㅋㅋ 맥북팔고 XNote 사서 해킨설치했는데 좋네. [2] Mayu갤로그로 이동합니다. 10.12.21 177 0
226085 기숙사 나와서 지금 죤나 기쁘다 씨발. [5] 야호(175.199) 10.12.21 127 0
226084 전문대 교수는 다이렇냐 [4] Mayu갤로그로 이동합니다. 10.12.21 317 0
226083 오늘은 좀 많이 따땃하다 [3] 땡칠도사갤로그로 이동합니다. 10.12.21 114 0
226082 60넘어서 무의미한 인간이 되지 않기위해 오늘도 열공한다. [5] 홍어(218.51) 10.12.21 108 0
226080 구글 접속 차단의 건 prismatic갤로그로 이동합니다. 10.12.21 120 0
226079 달팽이는 나의 원수 달팽이를 죽입시다 [2] 꼬비갤로그로 이동합니다. 10.12.21 176 0
226075 아나 무슨 공유기도 못쓰게하네 -- [12] 대마법서오즈갤로그로 이동합니다. 10.12.21 166 0
226074 아직 함수넣는걸 잘 못해서그런지 자꾸 오류뜸;; [6] 가터벨트갤로그로 이동합니다. 10.12.21 80 0
226073 저 dev-C++사용하는데 F5로는 안됌 [5] 가터벨트갤로그로 이동합니다. 10.12.21 93 0
226072 은꼬르 [3] elwlwlwk갤로그로 이동합니다. 10.12.21 181 0
226069 글 써져라 얍! [8] 식빵맛파슬리(110.15) 10.12.21 50 0
226068 소스를이렇게짜면 혼납니꺼? [1] ㄹㄴㅇ(59.24) 10.12.20 136 0
226067 방학동안 컴공과 1학년내용 독학하려는데 책좀 추천해주세요 ㅠㅠ ㅎㅅ(211.117) 10.12.20 96 0
226066 stack (int = 100) 이게 뭘까요 [8] 무휴학반수생(165.194) 10.12.20 155 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2