做了一天的数据结构实验——能够进行算术表达式的计算

根据书上的思路,书上只能够处理后缀表达式,但题目要求是输入的是中缀表达式,因此需要进行转化

  • 中缀表达式转后缀表达式的思路

    1、先读入输入的数据,用getline(cin,s)的方式;
    2、搞一个中间栈,用于存放遍历数组时遇到的符号,方便后续能够将符号弹出到后续表达式上;
    3、注意提取数字、运算符号的方式;

cc5afe78eb8809e18c4ce7bfd67b02f

  • 一些小知识点

    1、可以通过控制数据输入流的方式,对流入的数据进行处理,从而可以将输入的算术表达式中的数字提取为double型数据

    while (infile >> ch, ch != '#') {
    switch (ch) {
    case '+':case '-':case '*':case '/':
    DoOperator(ch);
    break;
    default:infile.putback(ch); // 这里的putback是真让我大开眼界

    infile >> newOperand;

    AddOperand(newOperand);
    }
    }

    2、string类型数据怎么能作为需要char星类型函数的参数,方法是直接将string类型数据的首地址作为那一个char星类型的参数

    int getop(char* src, int start, int& nextstart, char* token) {
    int i, j;
    if (IsNumber(src[start])) {
    for (i = 0; IsNumber(src[start + i]) || src[start + i] == '.'; i++) {
    token[i] = src[start + i]; // 其实token就是用来提取表达式中的值的
    }
    token[i] = 0; // 注意,此处的0并非是字符的‘0’,而是数字0,因此可以用来作为for循环的终止判断条件
    nextstart = start + i; // 下一次用于提取表达式中的数字
    return 1;
    }
    else if ((src[start] == '+' || src[start] == '-') && (start == 0 || src[start - 1] == '(')) {
    // 确保存进来的这一位是一个带符号数,后面的判断条件就是限制其满足符号数的规则
    if (src[start] == '-') {
    token[0] = src[start];
    j = 1; // 如果是负号的话,就把负号给token[0],然后j=1就是从第二位开始把负号输进去
    }
    else {
    // 去掉正号的情况
    j = 0;
    }
    for (i = 1; IsNumber(src[start + i]) || src[start + i] == '.'; i++) {
    // 将后面的数值添加到token里面
    token[j++] = src[start + i];
    }
    token[j] = 0; // 可以简单的理解为以0作为token的一个分割符,事实上也可以用‘ ’开作为其分隔符的
    nextstart = start + i;// 下一次提取的开端
    return 1;
    }
    else {
    token[0] = src[start]; // 从输入流中将该符号进行提取
    token[1] = 0;
    nextstart = start + 1;// 下一次提取的开端
    }
    return 0; // 不是数据
    }
    string zhong;
    char hou[100]="";
    //char zhong[100]="",hou[100] = "";
    //cout << "请输入一句中缀表达式:" << endl;
    //getline(cin, zhong);
    zhong = gouZhao;
    //cin.getline(zhong,100);
    // 进行中缀转后缀
    Zhong2Hou(&zhong[0], hou);