首先看一下题
描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足 ∣val∣≤231−1 ,即只进行整型运算,确保输入的表达式合法
输入描述:
输入算术表达式
输出描述:
计算出结果值
示例1
输入:
400+5输出:
405
一、问题分析
首先读题,仔细看描述中的内容,发现需求是
1.给定一个字符串描述的算术表达式,计算出结果值
2.输入字符串长度不超过100,合法的字符包括加减乘除左括号右括号0-9
3.数据范围:运算过程中和最终结果均满足val的绝对值小于等于2的三十一次方-1
4.即只进行整形运算,确保输入的表达式合法
5.输入描述:输入算术表达式
6.输出描述:计算出结果值
二、解题思路
1.首先包含标准输入输出库,字符串处理库,字符类型判断库
#include <stdio.h>
#include <string.h>
#include <ctype.h>
2.然后我们顶一个一个全局变量int i = 0;用来当作我们字符串的索引
3.定义一个int calculate(char *a){函数
4.在函数中,定义int len = strlen(a);a的长度
5.然后定义一个栈,int stack[100] = {0};
6.定义一个整数变量int i_stack = 0;作为栈的指针
7.定义一个int flag = "+";用来存储我们要处理的符号
8.开始循环while(i < len) {
9.定义一个存储数字的临时整数int n = 0;
10.判断当前字符是否是左括号,如果是左括号,递归调用calculate函数并将结果储存到n中
if(a[i] == '(') {
i++;
n = calculate(a);
}
11.之后判断i是否是数字,如果是数字且i<len,我们将整个数字读取到n中
while(isdigit(a[i]) && i < len) {
n = n * 10 + a[i] - '0';
}
12.然后我们判断flag的符号,根据符号决定做什么运算
switch(flag){
case '+':
stack[i_stack++] = n;
break;
case '-':
stack[i_stack++] = -n;
break;
case '*':
stack[i_stack - 1] *= n;
break;
case '/':
stack[i_stack - 1] /= n;
}
13.然后我们判断是否是右括号,如果是右括号我们break;
if(a[i] == ')'){
i++;
break;
}
14.我们计算int sum = 0;的值
for (int j = 0; j < i_stack; j++) {
sum += stack[j];
}
return sum;
}
15.然后我们写主程序
int main() {
16.先定义一个char input[101] = {0};
17.然后读取scanf("%s", input);
18.之后计算int n = calculate(input);
19.返回结果printf("%d\n", n);
20.return 0;
}
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int i = 0;
int calculate(char *a) {
int flag = '+';
int stack[101] = {0};
int i_stack = 0;
int len = strlen(a);
while(i < len) {
int n = 0;
if(a[i] == '(') {
i++;
n = calculate(a);
}
while(isdigit(a[i]) && i < len) {
n = n * 10 + a[i++] - '0';
}
switch(flag) {
case '+':
stack[i_stack++] = n;
break;
case '-':
stack[i_stack++] = -n;
break;
case '*':
stack[i_stack - 1] *= n;
break;
case '/':
stack[i_stack - 1] /= n;
break;
}
if(a[i] == ')') {
i++;
break;
}
flag = a[i++];
}
int sum = 0;
for(int j = 0; j < i_stack; j++) {
sum += stack[j];
}
return sum;
}
int main() {
char input[101];
scanf("%s",input);
int n = calculate(input);
printf("%d\n", n);
return 0;
}