《数据结构学习与实验指导》3-7:求前缀表达式的值

来源:互联网 发布:阿里云磁盘扩容 编辑:程序博客网 时间:2024/06/03 12:13

实验内容:计算前缀表达式的值。
输入说明:输入一行不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象之间用空格分隔。
输出说明:输出前缀表达式的运算结果,精确到小数点后1位,或输出错误信息“ERROR“。
测试用例:
输入 | 输出
+ + 2 * 3 - 7 4 / 8 4 | 13.0
/ -25 + * - 2 3 4 / 8 4 | 12.5
/ 5 + * - 2 3 4 / 8 2 | ERROR
+10.23 | 10.2

#include <stdio.h>#include <stdlib.h>#define MaxSize 30typedef struct {    char *arr;    int size;} *PList_3_7;PList_3_7 initList_3_7();void addList_3_7(PList_3_7 list, char c);void printList_3_7(PList_3_7 list);void clearList_3_7(PList_3_7 list);void releaseList_3_7(PList_3_7 list);float doCharArr2Float_3_7(char *arr, int startIndex, int size);float doCal_3_7(char opt, float num1, float num2);int main() {    float n = test_3_7_0();    if (n > -9999999) {        printf("%.1f\n", n);    }    return 0;}float test_3_7_0() {    float num = 0;    PList_3_7 list = initList_3_7();    char c;    while (1) {        c = getchar();        if (c != ' ' && c != '\n') {            addList_3_7(list, c);        } else {            if (list->size > 1) {                if (list->arr[0] == '-' || list->arr[0] == '+') {                    num = doCharArr2Float_3_7(list->arr, 1, list->size);                    if (list->arr[0] == '-') {                        num *= -1;                    }                } else {                    num = doCharArr2Float_3_7(list->arr, 0, list->size);                }                break;            } else if (list->size == 1) {                if (list->arr[0] >= '0' && list->arr[0] <= '9') {                    num = doCharArr2Float_3_7(list->arr, 0, list->size);                    break;                } else {                    char opt = list->arr[0];                    float num1 = test_3_7_0();                    float num2 = test_3_7_0();                    if (num1 <= -8999999 || num2 <= -8999999) {                        num = -9999999;                    } else {                        num = doCal_3_7(opt, num1, num2);                    }                    break;                }            }            clearList_3_7(list);        }        if (c == '\n') {            break;        }    }    return num;}PList_3_7 initList_3_7() {    PList_3_7 list = (PList_3_7) malloc(sizeof(PList_3_7));    list->arr = (char *) malloc(sizeof(char) * MaxSize);    list->size = 0;    return list;}void addList_3_7(PList_3_7 list, char c) {    if (list->size < MaxSize) {        list->arr[list->size] = c;        list->size ++;    }}void printList_3_7(PList_3_7 list) {    for (int i = 0; i < list->size; i++) {        printf("%c", list->arr[i]);    }    printf("\n");}void clearList_3_7(PList_3_7 list) {    list->size = 0;}void releaseList_3_7(PList_3_7 list) {    free(list->arr);    free(list);}float doCharArr2Float_3_7(char *arr, int startIndex, int size) {    int num1 = 0;    float num2 = 0;    int i = startIndex;    while (i < size) {        if (arr[i] == '.') {            i++;            break;        }        num1 = num1 * 10 + (arr[i] - '0');        i++;    }    float j = 10.0;    while (i < size) {        num2 += (arr[i] - '0') / j;        j *= 10;        i++;    }    return num1 + num2;}float doCal_3_7(char opt, float num1, float num2) {    float num = 0;    switch (opt) {        case '+' :            num = num1 + num2;            break;        case '-' :            num = num1 - num2;            break;        case '*' :            num = num1 * num2;            break;        case '/' :            if (num2 > -0.000001 && num2 < 0.000001) {                printf("ERROR\n");                num = -9999999;            } else {                num = num1 / num2;            }    }    return num;}
阅读全文
0 0
原创粉丝点击