#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#define PLUS_MINUS 1
#define MUL_DIV 2
#define Lp_Rp 0
int top = 0;
int prior(char c)
{
int pri=0;
switch(c)
{
case '+' :
pri = PLUS_MINUS;
break;
case '-' :
pri = PLUS_MINUS;
break;
case '*' :
pri = MUL_DIV;
break;
case '/' :
pri = MUL_DIV;
break;
case '(' :
pri = Lp_Rp;
break;
case ')' :
pri = Lp_Rp;
break;
}
return pri;
}
void push(char *arr, char c)
{
top++;
arr[top]=c;
}
void pop(char *arr)
{
if(arr[top] == '(' || arr[top] == ')')
top--;
else
printf("%c",arr[top--]);
}
int main()
{
int i=0;
char str[20];
char stack[20];
memset(str,0,20);
memset(stack,0,20);
printf("수식을 입력하세요 : ");
scanf("%s", str);
printf("친거 :%s\n",str);
for(i=0 ; i
{
if( isdigit(str[i]) )//숫자일 경우
{
printf("%c", str[i]);
}
else if ( i==(strlen(str)-1) ) //배열의 끝 19에 도달하면 arr[19]일때
{
while( top!=0 ) //stack에 있는 모든 원소 출력
pop(stack);
}
else //문자일 경우
{
if ( str[i] == '(' || str[i] == ')' ) // 괄호일 때 괄호를 스택에 넣어주고 )일경우에는 (까지 다 팝 시키는 이프문
{
push(stack, str[i]);
if ( str[i] == ')' )
{
while ( stack[top] != '(' )
pop(stack);
pop(stack); // ( 를 출력
}
}
else if( top > 0 && prior(str[i]) <= prior(stack[top]) ) //stack에 연산자 있고, 새로 들어온 것이 스택보다 같거나 작으면 팝
{
pop(stack);
push(stack,str[i]);
}
else //연산자 우선순위가 높으면 무조건 push
{
push(stack, str[i]);
}
}
}
return 0;
}
임의의 숫자 20을 배열의 길이로 넣고 중위를 후위로 변환중입니다.
strlen을 이용해서 i를 20번 다 돌리고
그 중간에 else if를 사용해서 입력한 부분까지 i가 도착하면 stack에 들어있는 모든 연산자를 뽑아주려는데
1+2 를 치면 +가 안나오고 1+2-3을 치면 -가 안나오네요.
마지막 스택에 있는 연산자가 나오질 않는 것 같은데 원인을 알 수가 없네요.
printf문을 넣어서 확인을 해보았는데 저 두번째 else if 부분이 아예 작동을 안 하네요.
학교과제중입니다.!