Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define STACKSIZE 100
- #define MAXLEN 1000
- double stack[STACKSIZE];
- int top;
- void push(double f);
- double pop(void);
- double atof(char s[]);
- int getline(char line[]);
- int isNum(char c);
- void convert(char s[], char t[], const int len);
- int main(void) {
- char number[MAXLEN];
- int len = 0;
- double num = 0.0;
- char line[MAXLEN], result[MAXLEN];
- while ((len = getline(line)) != 0) {
- int t1 = 0, t2 = 0;
- for (int i = 0; i < len; ++i) {
- if (line[i] == '(') ++t1;
- else if (line[i] == ')') ++t2;
- }
- if (t1 != t2) { printf("Mismatched parenthesis!\n"); continue; }
- convert(line, result, len);
- printf("%s\n", result);
- len = 0;
- for (int i = 0; result[i] != '\0'; ++i) {
- switch (result[i]) {
- case '+':
- num = pop();
- push(pop() + num);
- ++i;
- break;
- case '-':
- num = pop();
- push(pop() - num);
- ++i;
- break;
- case '*':
- num = pop();
- push(pop() * num);
- ++i;
- break;
- case '/':
- num = pop();
- push(pop() / num);
- ++i;
- break;
- case ' ':
- number[len] = '\0';
- push(atof(number));
- len = 0;
- break;
- default:
- number[len++] = result[i];
- break;
- }
- }
- printf("%f\n\n", pop());
- top = 0;
- }
- return 0;
- }
- void push(double f) {
- stack[top++] = f;
- }
- double pop(void) {
- return stack[--top];
- }
- double atof(char s[]) {
- int sign = 1, value = 0, power = 1 , i = 0;
- if (s[i] == '-') { sign = -1; ++i; }
- for (; isNum(s[i]); ++i) value = 10 * value + (s[i] - '0');
- if (s[i] == '.') ++i;
- while (isNum(s[i])) {
- value = 10 * value + (s[i++] - '0');
- power *= 10;
- }
- return sign * value/(double)power;
- }
- int getline(char line[]) {
- int c;
- int i = 0;
- while ((c = getchar()) != '\n') {
- line[i++] = c;
- }
- line[i] = '\0';
- return i;
- }
- int isNum(char c) {
- return ((c >= '0' && c <= '9')) ? 1 : 0;
- }
- void convert(char s[], char t[], const int len) {
- int k = 0, l = 0;
- char stack[MAXLEN];
- for (int i = 0; i < len; ++i) {
- if (isNum(s[i]) || s[i] == '.') { t[k++] = s[i]; if((i+1 != len) && !(isNum(s[i+1]) || s[i+1] == '.')) t[k++] = ' '; }
- else if (s[i] == ')') {
- while (stack[--l] != '(') {
- t[k++] = stack[l];
- t[k++] = ' ';
- }
- --l;
- }
- else {
- switch(s[i]) {
- case '(':
- stack[l++] = '(';
- break;
- case '+':
- case '-':
- while (stack[--l] != '(' && l>=0) {
- t[k++] = stack[l];
- t[k++] = ' ';
- }
- stack[++l] = s[i];
- break;
- case '*':
- case '/':
- while (stack[--l] != '+' && stack[l] != '-' && stack[l] != '(' && l>=0) {
- t[k++] = stack[l];
- t[k++] = ' ';
- }
- stack[++l] = s[i];
- break;
- default:
- break;
- }
- if (s[i] != ' ') stack[l++] = s[i];
- }
- }
- if (t[k-1] != ' ') t[k++] = ' ';
- while (l > 0) { t[k++] = stack[--l]; t[k++] = ' '; }
- t[k] = '\0';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement