infix수식을prefix수식으로 나타냈는데 while문에서 에러가;;;;
그리고복잡도가뭔지설명좀해주세요~
#include <stdio.h>
#include <string.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
typedef enum {lparen, rparen, plus, minus, times, divide,
mod , eos, operand} precedence;
int isp[]={19,0,12,12,13,13,13,0};
int icp[]={19,20,12,12,13,13,13,0};
//사용자 정의 함수
void prefix();
precedence get_token(char *symbol, int *n);
char print_token(precedence token);
precedence u_delete(int *top);
void u_add(int *top, precedence token);
char expr[MAX_EXPR_SIZE];
char buffer[MAX_EXPR_SIZE];
precedence stack[MAX_STACK_SIZE];
precedence token;
precedence t_token;
char symbol;
int n=0;
int top=0;
int btop=0;
int main(void)
{
int intSelect;
while()
{
printf("Infix -> Pretfix 바꾸기 : ");
scanf("%d",&intSelect);
if(intSelect)
{
n=0;//전역 변수 값 리셋
top=0;
btop=0;
prefix();
return 0;
}
}//end of while
}//end of main
void prefix()
{
int length,j;
//precedence stack[MAX_STACK_SIZE];
//precedence token;
printf("\n수식을 입력해 주세요\n");
printf("infix >> ");
scanf("%s",expr); //infix : char 배열
length=strlen(expr);
n=length-1; //수식의 길이 값을 구하여 수식의 크기만큼 반복하기 위한 제어변수
/*for(i=0 ; i<=length ; i++)
{
stack[i]=expr[i]//문자열을 열거형 스택에 치환
}*/
stack[0]=eos;
printf("prefix >> ");
for(j=0; j<length; j++)//token=get_token(&symbol, &n); token!=eos; token=get_token(&symbol, &n))
{
token=get_token(&symbol, &n);
if(token==operand)
{
buffer[btop]=symbol;
btop++;
//printf("%c", symbol);
}
else if(token==lparen)
{
while(stack[top]!=rparen)
{
buffer[btop]=print_token(u_delete(&top));
btop++;
}
u_delete(&top);
}
else
{
while(isp[stack[top]]>icp[token]) //전위에선 우선 순위가 같아도 나오지 않는다.즉 클 때만 나온다.
{
buffer[btop]=print_token(u_delete(&top));
btop++;
}
u_add(&top, token);
}
}//enf of for
while ((token=u_delete(&top))!=eos)
{
buffer[btop]=print_token(token);
btop++;
}
for(j=length-1; j>=0; j--)
{
printf("%c",buffer[j]);
}
printf("\n");
}
precedence get_token(char *symbol, int *n)
{
//배열의 오른쪽 부터 왼쪽으로 수식을 읽어 나간다.(n=length)
*symbol=expr[(*n)];
(*n)--;
switch(*symbol)
{
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '/' : return divide;
case '*' : return times;
case '%' : return mod;
case ' ' : return eos;
default : return operand;
}
}
char print_token(precedence token)
{
switch(token)
{
case lparen: return '(';
//break;
case rparen: return ')';
//break;
case plus : return '+';
//break;
case minus : return '-';
//break;
case divide: return '/';
//break;
case times : return '*';
//break;
case mod : return '%';
//break;
}
return 0;
}
precedence u_delete(int *top)
{
//precedence t_token;
t_token = stack[*top];
(*top)--;
return t_token;
}
void u_add(int *top, precedence token)
{
(*top)++;
stack[*top] = token;
}
|