【算法设计题】实现以字符串形式输入的简单表达式求值,第2题(C/C++)

2024-08-05 08:34:42 浏览数 (1)

第2题 实现以字符串形式输入的简单表达式求值

编写算法,实现以字符串形式输入的简单表达式求值,表达式的运算符仅有 、-、*、/、%五种。并且已知函数 float GetVaule(char ch[],int start)能返回字符串从 start 位置开始的第一个数字。 例如:若 ch="1.2 3.4*5.6 7.8" ,则 GetVaule(ch,1),返回的值是1.2;GetVaule(ch,5),返回的值是 3.4。

得分点(必背)
代码语言:javascript复制
//得分点:1.2 3.4*5.6 7.8
// 定义 Figure_Value 函数
float Figure_Value(char ch[]) {

    int n=strlen(ch);
    float count=0;
    float num_queue[n];
    int front1=0,rear1=-1;
    int front2=0,rear2=-1;
    char ch_queue[n];

    //获取第一个数字并存入num_queue
    num_queue[  rear1]=GetValue(ch,0);

    for(int i=0;i<n;i  )
    {
        if(ch[i]==' '||ch[i]=='-'){
            num_queue[  rear1]=GetValue(ch,i 1);
            ch_queue[  rear2]=ch[i];
        }
        else if(ch[i]=='*'){
            num_queue[rear1]=num_queue[rear1]*GetValue(ch,i 1);
        }
        else if (ch[i]=='/')
        {
            num_queue[rear1]=num_queue[rear1]/GetValue(ch,i 1);
        }
        else if (ch[i]=='%')
        {
            num_queue[rear1]=static_cast<int>(num_queue[rear1])%static_cast<int>(GetValue(ch,i 1));
        }
    } 

    //初始化count为num_queue中的某一个元素
    count=num_queue[front1  ];
    //处理加减法
    while(front2<=rear2)
    {
        if (ch_queue[front2]==' '){
            count=count num_queue[front1  ];
        }
        else if (ch_queue[front2]=='-'){
            count=count-num_queue[front1  ];
        }
         front2  ;
    }
   
    return count;
}
题解

下面是对 Figure_Value 函数进行详细的解释,以帮助你理解代码的工作原理并编写题解:

1. 初始化和变量定义
代码语言:javascript复制
int n = strlen(ch);
float count = 0;
float num_queue[n];
char ch_queue[n];
int front1 = 0, rear1 = -1;
int front2 = 0, rear2 = -1;
  • n 保存输入字符串的长度。
  • count 用于存储计算结果。
  • num_queue 是一个浮点数队列,用于存储数字。
  • ch_queue 是一个字符队列,用于存储运算符。
  • front1rear1 是操作 num_queue 的前端和后端指针。
  • front2rear2 是操作 ch_queue 的前端和后端指针。
2. 获取第一个数字并存入队列
代码语言:javascript复制
num_queue[  rear1] = GetValue(ch, 0);

调用 GetValue 函数从字符串的开头获取第一个数字,并将其存入 num_queue

3. 遍历表达式字符串,处理运算符和数字
代码语言:javascript复制
for (int i = 0; i < n; i  ) {
    if (ch[i] == ' ' || ch[i] == '-') {
        num_queue[  rear1] = GetValue(ch, i   1);
        ch_queue[  rear2] = ch[i];
    } else if (ch[i] == '*') {
        num_queue[rear1] = num_queue[rear1] * GetValue(ch, i   1);
    } else if (ch[i] == '/') {
        num_queue[rear1] = num_queue[rear1] / GetValue(ch, i   1);
    } else if (ch[i] == '%') {
        num_queue[rear1] = static_cast<int>(num_queue[rear1]) % static_cast<int>(GetValue(ch, i   1));
    }
}

遍历字符串 ch,根据字符是运算符还是数字,执行不同的操作:

  • 如果是加法或减法运算符,将下一个数字存入 num_queue,并将运算符存入 ch_queue
  • 如果是乘法、除法或取余运算符,直接对 num_queue 的最后一个元素进行运算。
4. 初始化 count 并处理加减法运算
代码语言:javascript复制
count = num_queue[front1  ];

while (front2 <= rear2) {
    if (ch_queue[front2] == ' ') {
        count = count   num_queue[front1  ];
    } else if (ch_queue[front2] == '-') {
        count = count - num_queue[front1  ];
    }
    front2  ;
}
  • count 初始化为 num_queue 中的第一个元素。
  • 遍历 ch_queue,根据运算符的类型,对 count 进行加减操作。
代码详解
  1. 问题描述:编写一个函数 Figure_Value,计算以字符串形式输入的简单表达式的值。表达式的运算符仅包括 -*/% 五种。
  2. 输入:一个包含表达式的字符串,例如 "1.2 3.4*5.6 7.8"
  3. 输出:计算表达式的结果。
  4. 函数说明
    • GetValue 函数:从字符串的指定位置开始,提取并返回第一个数字(浮点数)。
    • Figure_Value 函数:解析输入字符串并计算表达式的值。
  5. 实现步骤
    • 初始化变量和队列。
    • 获取第一个数字并存入 num_queue
    • 遍历表达式字符串,根据运算符的类型执行不同操作:
      • 对于加法和减法运算符,将数字和运算符分别存入 num_queuech_queue
      • 对于乘法、除法和取余运算符,直接对 num_queue 的最后一个元素进行计算。
    • 初始化 countnum_queue 中的第一个元素。
    • 遍历 ch_queue,根据运算符的类型,对 count 进行加减操作。
  6. 示例
    • 输入:"1.2 3.4*5.6 7.8"
    • 输出:计算结果 1.2 (3.4 * 5.6) 7.8 的值。

0 人点赞