중위표기식을 후위표기식으로 변환
#include
#include
#include
using namespace std;
stack s;
char print[99999];
int i=0;
int precedence(int op){
if (op == '(') return 3;
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
else return 0;
}
int cal(char a){
if(a=='('){
s.push('(');
}
else if(a==')'){
while(s.top()!='('){
print[i]=s.top();
i++;
s.pop();
}
s.pop();
}
else if(a=='+'||a=='-'||a=='*'||a=='/'){
while(precedence(s.top())>=precedence(a)){
print[i]=s.top();
i++;
s.pop();
s.push(a);
}
}
else{
print[i]=a;
i++;
}
}
int main(void){
char a;
int j;
for(;a=')';){
a=getche();
cal(a);
}
while(!s.empty()){
print[i]=s.top();
s.pop();
}
for(i=j;j<=i;j++)
{
printf("%c",print[j]);
}
return(0);
}
이렇게 짜긴 했는데....
실행하면 글씨를 쓰다가 글씨가 써지지를 않습니다. 그 밖에도 오류가 많은 것 같은데 어떻게 고쳐야 할까요?


저는 컴파일이 안됩니다.
...
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
getche()
getche() 는 이렇다고 합니다.
http://kcoder.tistory.com/43
입력 끝이 \r로 버퍼가 없다고 합니다.
for(;a=')';) { a=getche(); printf("%c\n",a); cal(a); } 출력화면 : 하나를 입력하면. 이렇게 2번 출력 됩니다. 함수. 인자값. 리턴값. 오류값을 확인해주십시요. aa bb ccgetch() 를 사용하면. 한 문자씩 나옵니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
디버그해서 출력해보면.
원인은 13x 5 에서 일어났습니다.
while(precedence(s.top())>=precedence(a)) //여기서 문제 발생
{
}
풀어서 값을 확인해보면. 디버그하기 편할겁니다.
while(1)
{
char cc = s.top();
int n1 = precedence(cc);
int n2 = precedence(a);
if(n1 >= n2)
{
break;
}
}
#include <stdio.h> #include <stack> #include <iostream> #include <conio.h> /* #include <iostream> #include <assert.h> #include <errno.h> #include <setjmp.h> #include <stdarg.h> #include <algorithm> */ #include <queue> #include <deque> #include <vector> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; //typedef stack<int, deque<int> > STACK_INT; //https://support.microsoft.com/ko-kr/kb/158040 stack<char> s; //deque<char> s; //[Error] 'getche' was not declared in this scope //http://kcoder.tistory.com/43 char print[99999]; int i=0; int cnt=0; int precedence(int op) { printf("0 %d\n", cnt); cnt++; if (op == '(') { printf("1 %d\n", cnt); cnt++; return 3; } if (op == '+' || op == '-') { printf("2 %d\n", cnt); cnt++; return 1; } if (op == '*' || op == '/') { printf("3 %d\n", cnt); cnt++; return 2; } else { printf("4 %d\n", cnt); cnt++; return 0; } } int cal(char a) { printf("5x %d\n", cnt); cnt++; if(a=='(') { printf("5 %d\n", cnt); cnt++; s.push('('); printf("6 %d\n", cnt); cnt++; } else if(a==')') { printf("7x %d\n", cnt); cnt++; while(s.top()!='(') { printf("7 %d\n", cnt); cnt++; print[i]=s.top(); printf("8 %d\n", cnt); cnt++; i++; printf("9 %d\n", cnt); cnt++; s.pop(); printf("10 %d\n", cnt); cnt++; } printf("11 %d\n", cnt); cnt++; s.pop(); printf("12 %d\n", cnt); cnt++; } else if(a=='+'||a=='-'||a=='*'||a=='/') { printf("13x %d\n", cnt); cnt++; while(precedence(s.top())>=precedence(a)) //여기서 문제 발생 { printf("13 %d\n", cnt); cnt++; print[i]=s.top(); printf("14 %d\n", cnt); cnt++; i++; printf("15 %d\n", cnt); cnt++; s.pop(); printf("16 %d\n", cnt); cnt++; s.push(a); printf("17 %d\n", cnt); cnt++; } printf("17x %d\n", cnt); cnt++; } else { printf("18 %d\n", cnt); cnt++; print[i]=a; printf("19 %d\n", cnt); cnt++; i++; printf("20 %d\n", cnt); cnt++; } printf("20x %d\n", cnt); cnt++; } int main(int argc, char** argv) { char a; int j; for(;a=')';) { printf("21 %d\n", cnt); cnt++; a=getch(); printf("22 %c\n",a); printf("23 %d\n", cnt); cnt++; cal(a); printf("24 %d\n", cnt); cnt++; } printf("end\n"); while(!s.empty()) { printf("25 %d\n", cnt); cnt++; print[i]=s.top(); printf("26 %d\n", cnt); cnt++; s.pop(); printf("27 %d\n", cnt); cnt++; } for(i=j;j<=i;j++) { printf("28 %d\n", cnt); cnt++; printf("%c",print[j]); printf("29 %d\n", cnt); cnt++; } return(0); } #if 0 21 0 22 + 23 1 5x 2 13x 3 #endif----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기