第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
是一个字符队列,用于存储运算符。front1
和rear1
是操作num_queue
的前端和后端指针。front2
和rear2
是操作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
进行加减操作。
代码详解
- 问题描述:编写一个函数
Figure_Value
,计算以字符串形式输入的简单表达式的值。表达式的运算符仅包括-
、*
、/
和%
五种。 - 输入:一个包含表达式的字符串,例如
"1.2 3.4*5.6 7.8"
。 - 输出:计算表达式的结果。
- 函数说明:
GetValue
函数:从字符串的指定位置开始,提取并返回第一个数字(浮点数)。Figure_Value
函数:解析输入字符串并计算表达式的值。
- 实现步骤:
- 初始化变量和队列。
- 获取第一个数字并存入
num_queue
。 - 遍历表达式字符串,根据运算符的类型执行不同操作:
- 对于加法和减法运算符,将数字和运算符分别存入
num_queue
和ch_queue
。 - 对于乘法、除法和取余运算符,直接对
num_queue
的最后一个元素进行计算。
- 对于加法和减法运算符,将数字和运算符分别存入
- 初始化
count
为num_queue
中的第一个元素。 - 遍历
ch_queue
,根据运算符的类型,对count
进行加减操作。
- 示例:
- 输入:
"1.2 3.4*5.6 7.8"
- 输出:计算结果
1.2 (3.4 * 5.6) 7.8
的值。
- 输入: