#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
typedef enum {lparan, rparan, plus, minus, times, divide, mod, eos, operand}precedence;
char expr[MAX_EXPR_SIZE];
precedence stack[MAX_STACK_SIZE];
static int isp[] = { 0,19,12,12,13,13,13,0 };
static int icp[] = { 20,19,12,12,13,13,13,0 };
precedence get_token(char *symbol, int *n) {
*symbol = expr[(*n)++];
switch (*symbol) {
case '(': return lparan;
case ')': return rparan;
case '+': return plus;
case '-': return minus;
case '/': return divide;
case '*': return times;
case '%': return mod;
case '\0': return eos;
defalut : return operand;
}
}
int top = 0;
void push(precedence item) {
stack[++top] = item;
}
precedence pop() {
return stack[top--];
}
void print_token(precedence token) {
switch (token) {
case plus: printf("+"); break;
case minus: printf("-"); break; ;
case divide: printf("/"); break ;
case times: printf("*"); break ;
case mod: printf("%"); break ;
defalut: printf(""); break;
}
}
void postfix() {
char symbol;
precedence token;
int n = 0;
stack[0] = eos;
for (token = get_token(&symbol, &n); token != eos; token = get_token(&symbol, &n)) { // 여기서 if문으로 안넘어가고 프로그램이 종료됨
if (token == operand) {
printf("%c", symbol);
}
else if (token == rparan) {
while (stack[top] != lparan) {
print_token(pop());
}
pop();
}
else {
while (isp[stack[top]] >= icp[token]) {
print_token(pop());
}
push(token);
}
}
while ((token = pop()) != eos) {
print_token(token);
}
printf("\n");
}
int main() {
FILE* fp = fopen("in.txt", "r");
fscanf_s(fp, "%s", expr,MAX_EXPR_SIZE);
postfix();
fclose(fp);
}
뭐 에러가 나는것도 아니고 그냥 중간에 뚝 끊기니까 너무 갑갑해
해보니까 출력 되는데. in.txt 에 1+1 넣고 돌려봐
vs로 하니까 안되는데 혹시 뭐로 돌렸음?
유닉스에서 소스 약간 고쳐서 돌렸는데
일단 내컴에서는 in.txt 에 1+1 넣고 돌리니까.. 11+ 이렇게 출력되드라
왜 안되노...
어라 + 밖에 안나오네 ㅋ
이제 되네
diff --git a/exam.c b/exam.cindex 51fc930..c4031c1 100644--- a/exam.c+++ b/exam.c@@ -46,10 +46,10 @@ precedence get_token(char *symbol, int *n) { case '\0': return eos; - defalut : return operand;-+ defalut :+ break; }-+ return operand; }@@ -88,7 +88,7 @@ void print_token(precedence token) { case times: printf("*"); break ; -
흐미
precedence get_token(char *symbol, int *n) { *symbol = expr[(*n)++]; switch (*symbol) { case '(': return lparan; case ')': return rparan; case '+': return plus; case '-': return minus; case '/': return divide; case '*': return times; case '%': return mod; case '\0': return eos; defalut : break; } return operand;}
에혀 ㅅㅂ
case mod: printf("%%"); break ; 이렇게 %% 바꾸셈
precedence get_token(char *symbol, int *n) *symbol = expr[(*n)++]; switch (*symbol) { case '(': return lparan; case ')': return rparan; case '+': return plus; case '-': return minus;
case '/': return divide; case '*': return times; case '%': return mod; case '\0': return eos; defalut : break; } return operand; }
이렇게 고치셈. 님 소소 여기 잘못되어 있음
아니 시발 default라 적어놨었네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 고맙다