这段代码实现了一个简单的计算器程序,用于计算输入的算术表达式的结果。

#include <stdio.h>
#include <string.h>
// 设置符号优先级
int compareReturn(char str1) {
    if (str1 == '#') {
        return 0;
    } else if (str1 == '+' || str1 == '-') {
        return 1;
    } else if (str1 == '*' || str1 == '/') {
        return 2;
    } else {
        printf('输入了无效符号');
        return -1;
    }
}
// 计算函数
int jisuan(int x, char str1, int y) {
    int ans = 0;
    if (str1 == '+') {
        ans = x + y;
    } else if (str1 == '-') {
        ans = x - y;
    } else if (str1 == '*') {
        ans = x * y;
    } else if (str1 == '/') {
        ans = x / y;
    } else {
        ;
    }
    return ans;
}
int main(int argc, const char * argv[]) {
    // 初始化两个栈
    // 第一个栈为数字栈
    // 第二个栈为符号栈
    int firstStack [100] = {0};
    int firstTop = -1;
    char secondStack [100] = {'#'};
//    printf('%c', secondStack[0]);
    int secondTop = 0;
    char str[100];
    int flag = -1;
//    printf('请输入待计算的算术表达式:\n');
    scanf('%s', str);
    // 表达式长度
    int x = 0;
    int length = (int)strlen(str);
    for (int i = 0; i < length;) {
        if (str[i] >= '0' && str[i] <= '9') {
            x *= 10;
            x += str[i++] - '0';
            flag=1;
        } else {
            if(flag==1)
            {
            firstStack[++firstTop] = x;
            x = 0;
            flag=-1;
            }
            if (compareReturn(secondStack[secondTop]) < compareReturn(str[i])) {
                secondStack[++secondTop] = str[i++];
            } else {
                int b = firstStack[firstTop--];
                int a = firstStack[firstTop--];
//                printf('%d %c %d\n',a,secondStack[secondTop],b);
//                printf('%d\n', firstTop);
                firstStack[++firstTop] = jisuan(a, secondStack[secondTop], b);
                secondTop--;
                if (str[i] == '#' && secondTop == 0) {
                    break;
                }
            }
        }
    }
//    printf('%d\n', firstTop);
//    printf('%d\n', secondTop);
    printf('%d', firstStack[firstTop]);
    
    
}

执行步骤:

  1. 首先,程序会初始化两个栈,第一个栈为数字栈,第二个栈为符号栈。数字栈用于存储算术表达式中的数字,符号栈用于存储算术表达式中的符号。初始化数字栈的栈顶指针为-1,符号栈的栈顶指针为0。同时,将符号栈的第一个元素设置为'#'。
  2. 然后,程序会获取用户输入的算术表达式,并存储在字符数组str中。
  3. 接下来,程序会遍历表达式中的每个字符,进行如下操作:
    • 如果当前字符是数字,则将其转换为整数,并将其累加到x中。同时,将flag设置为1,表示当前正在处理数字。
    • 如果当前字符是符号,则需要将之前累加的数字x入栈,并将x重置为0。然后,将当前符号入栈。
      • 如果当前符号的优先级比栈顶符号的优先级高,则直接将当前符号入栈。
      • 如果当前符号的优先级不高于栈顶符号的优先级,则需要从数字栈中取出两个数字,并从符号栈中取出一个符号进行计算。然后,将计算结果入栈。同时,将栈顶指针相应地调整。
    • 如果当前字符是结束符号'#',且符号栈只剩下一个元素(即第一个元素'#'),则计算结束。
  4. 最后,程序输出数字栈中剩下的唯一一个元素,即为计算结果。

注意事项:

  • 输入的算术表达式只能包含数字、加号、减号、乘号和除号。
  • 输入的算术表达式不能有空格。
  • 输入的算术表达式的数字不能超过int类型的范围。
C语言实现简单计算器:算术表达式求值

原文地址: https://www.cveoy.top/t/topic/pdff 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录