#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 205 struct infix { char item[MAXSIZE*2]; char flag; } ans_stack[MAXSIZE];
double numSTACK[MAXSIZE]; int num[MAXSIZE],cnt;
char opSTACK[MAXSIZE]; int numTOP,ansTop;
void Init() { numTOP = -1; ansTop = -1; } void CAL(char op); int isLowerThan(char a,char b) { return ((a == '+' || a == '-') && (b == '*' || b == '/'))||(a=='*'&&b=='/'); } void addBrackets(char flag, char s[],char c); int main() { Init(); char in[300]; char c; int i, aim, now = 0, flag = 0; gets(in); scanf("%d", &aim); for (i = 0; in[i]; i++) { c = in[i]; if (c >= '0' && c <= '9') { now *= 10, now += c - '0'; flag = 1; } else if (c == ' ') { if (flag) { numSTACK[++numTOP] =(double) now; ans_stack[++ansTop].item[0] = 'n'; ans_stack[ansTop].flag = '#'; num[cnt++] = now; } now = 0; flag = 0; } else { addBrackets(ans_stack[ansTop - 1].flag, ans_stack[ansTop - 1].item, c); addBrackets(ans_stack[ansTop].flag, ans_stack[ansTop].item, c); int len = strlen(ans_stack[ansTop - 1].item); ans_stack[ansTop - 1].item[len] = c; len++; for (int j = 0;ans_stack[ansTop].item[j];j++) { ans_stack[ansTop - 1].item[len++] = ans_stack[ansTop].item[j]; } ans_stack[ansTop - 1].item[len] = '\0'; ans_stack[ansTop - 1].flag = c; memset(ans_stack[ansTop].item, '\0', sizeof(ans_stack[ansTop].item)); ansTop--; CAL(c); } } cnt = 0; if (aim == 2) { for (int i = 0; ans_stack[0].item[i];i++) { if(ans_stack[0].item[i]=='n') printf("%d", num[cnt++]); else printf("%c", ans_stack[0].item[i]); } printf("\n"); } printf("%.2lf", numSTACK[0]); return 0; } void addBrackets(char flag, char s[],char c) { if(flag!='#'&&isLowerThan(flag,c)) { int len = strlen(s); for (int j = len-1; j >= 0;j--) s[j + 1] = s[j]; s[0] = '('; s[len + 1] = ')'; s[len + 2] = '\0'; } return; } void CAL(char op) { if (op == '*') numSTACK[numTOP - 1] = numSTACK[numTOP - 1] * numSTACK[numTOP]; else if (op == '/') numSTACK[numTOP - 1] = numSTACK[numTOP - 1] / numSTACK[numTOP]; else if (op == '+') numSTACK[numTOP - 1] = numSTACK[numTOP - 1] + numSTACK[numTOP]; else if (op == '-') numSTACK[numTOP - 1] = numSTACK[numTOP - 1] - numSTACK[numTOP]; numTOP--; }
|