c计算数学表达式

来源:互联网 发布:中世纪2优化9毛子 编辑:程序博客网 时间:2024/05/04 10:25
/* ============================================================================ Name        : demo.c Author      : Johnson Z. Version     : Copyright   : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>struct node {double radix;char operator;struct node* next;};int npower(int n) {int val = 1;if (n == 0) return 1;while (n-- > 0)val *= 10;return val;}double get_value(char* str, int len) {double val = 0;char c = *str;len--;while (c != 0) {int i = c - 48; // '0' == 48val += i * npower(len--);str++;c = *str;}return val;}void compute(char* input) {printf("input=%s\n", input);struct node* head = NULL;struct node* ptr = NULL;struct node* pre = NULL;char* buf = (char*) calloc(1, 13);for (char c = *input; c != 0; c = *input) {pre = ptr;ptr = (struct node*) calloc(1, sizeof(struct node));ptr->operator = 0;ptr->next = NULL;if (NULL != pre) {pre->next = ptr;}if (NULL == head) {head = ptr;}if (c == '+' || c == '-' || c == '*' || c == '/') {ptr->operator = c;input++;continue;}int idx = 0;while (c != '+' && c != '-' && c != '*' && c != '/' && c != 0) {buf[idx++] = c;input++;c = *input;}buf[idx] = 0;ptr->radix = get_value(buf, idx);}pre = head;ptr = pre->next;while (ptr != NULL ) {if (ptr->operator && ptr->operator != '+' && ptr->operator != '-') {if (ptr->operator == '*') {pre->radix = (pre->radix) * (ptr->next->radix);}if (ptr->operator == '/') {pre->radix = pre->radix / ptr->next->radix;}pre->next = ptr->next->next;pre->operator = 0;ptr = pre->next;continue;}pre = ptr;ptr = ptr->next;}pre = head;ptr = pre->next;while (ptr != NULL ) {if (ptr->operator && ptr->operator != '*' && ptr->operator != '/') {if (ptr->operator == '+') {pre->radix = (pre->radix) + (ptr->next->radix);}if (ptr->operator == '-') {pre->radix = pre->radix - ptr->next->radix;}pre->next = ptr->next->next;pre->operator = 0;ptr = pre->next;continue;}pre = ptr;ptr = ptr->next;}printf("value=%.2f\n", pre->radix);ptr = head;while (ptr) {pre = ptr;ptr = ptr->next;free(pre);}free(buf);}int main(void) {compute("100/2-200/2+100*1+200*1-10/3");return EXIT_SUCCESS;}