题目:<表达式1|表达式2>这是一个字符串表达式1和表达式2只有简单的数字字符和+ - *组成,需要运算出正确结果,如果两个数字之间有多个(种)运算符的,只选择最靠前的运算符,如:2+-*2,则取+运算符。最后,将两个表达式的相加,输出结果。
首先是C语言实现,代码如下:
/**
<表达式1|表达式2>这是一个字符串表达式1和表达式2只有简单的数字字符和+ - *组成,需要运算出正确结果,
如果两个数字之间有多个(种)运算符的,只选择最靠前的运算符,如:2+-*2,则取+运算符。最后,将两个表达式的相加,输出结果。
创建者:
创建时间:2021年1月3日
**/
#include <stdio.h>
#include <string.h>
#include <math.h>
int strControl(char str[]); // 字符串处理函数的声明
void main()
{
char str[50]; // 定义一个字符数组
int res; // 存放运算的结果
gets(str);
res = strControl(str); // 字符串处理函数
printf("res = %d\n",res); // 输出结果
}
int strControl(char str[])
{
int len,sum=0,temp = 0,lenTemp = 0; // 变量的定义
int i,j=0,k=0; // 循环变量
int tempInt[50] = {0}; // 转换成的整数类型
char tempStr[50] = {0}; // 处理完的字符串
char flag = 0; // 标记位
len = strlen(str); // 字符串长度
for(i=0;i<len;i++)
{
if('|' == str[i]) // 将表达式之间的|转换成加号
{
str[i] = '+';
}
else if((str[i]<'0'||str[i]>'9') && (str[i] != '+' && str[i] != '-') ) // 剔除0-9,+-*以外的字符,用空格代替
{
str[i] = ' ';
}
}
puts(str); // 处理完输出查看效果
len = strlen(str); // 再次求出字符串的长度
for(i = 0; i < len-1;i++) // 取出离数字最近的那个运算符,其他的用空格代替
{
if(str[i] == '+' || str[i] == '-' || str[i] == ' ' )
{
if(str[i+1]>'9' || str[i+1]<'0')
{
str[i+1] = ' ';
}
}
}
puts(str); // 再出输出查看字符串处理效果
for(i=0;i<len;i++) // 剔除字符串中所有空格
{
if(str[i] != ' ')
{
tempStr[j] = str[i]; // 存储在最新的数组tempStr中
j++;
}
}
puts(tempStr); // 输出字符串处理效果
len = strlen(tempStr); // 求出最新处理完的字符串长度
for(i=0;i<len;i++) // 将运算符前面的数字字符串转换成整数
{
if(tempStr[i] == '+' || tempStr[i] == '-') //
{
j = flag;
lenTemp = i-flag;
while(j<i)
{
temp = temp + (tempStr[j]-'0')*(int)pow(10,--lenTemp);
j++;
}
flag = i+1;
tempInt[k] = temp;
k++;
temp = 0;
}
}
lenTemp = len-flag;
j = flag;
while(j<len) // 处理最后一个数字字符串 将其转换成整数
{
temp = temp + (tempStr[j]-'0')*(int)pow(10,--lenTemp);
j++;
}
tempInt[k] = temp;
k++;
for(i=0;i<k;i++) // 查看字符串处理结果是否正确
{
printf(" %d",tempInt[i]);
}
printf("\n");
sum = tempInt[0]; // 取第一个数据
for(i=0,j=1;i<len;i++) // 依据运算符计算出结果
{
switch(tempStr[i])
{
case '+':
sum = sum + tempInt[j++];
break;
case '-':
sum = sum - tempInt[j++];
break;
}
}
return sum;
}
/**
测试用例:
12+--2|12-12
12-45-52-+5-+4|7-5++-45
5-5+6+4+-4+8|9-4+46--+4
5-4+5-8
5-8+2+-4+-+9--5|8-45+-41+45-+12
41-+45+12-+4|45++-12
**/
C语言实现相对复杂,暂时没有实现乘法操作
Java的代码如下:
/**
*<表达式 1|表达式 2>这是一个字符串表达式1和表达式2只有简单的数字字符和+ - *组成,
*需要运算出正确结果,如果两个数字之间有多个(种)运算符的,只选择最靠前的运算符,
*如:2+-*2,则取+运算符。最后,将两个表达式的相加,输出结果。
*/
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
class Test{
String str;
public static void main(String[] args){
try{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
/*
* 字符串转算术表达式
*/
String str1 = "<2**++3|5--*3>";
Object result1 = engine.eval(getNewString(str1,0));
Object result2 = engine.eval(getNewString(str1,1));
System.out.println("计算结果:" + result1+result2 );
}catch(Exception e){
System.out.println(e);
}
}
public static String getNewString(String str,int index){
String[] strSplit = str.split("|");
String newStr = "";
String strCmp = "+-*";
boolean flag = true;
System.out.println("------------------");
System.out.println(strSplit[index]);
System.out.println("------------------");
for(int i = 0;i< strSplit[index].length;i++){
if(strCmp.contains(strSplit[index].charAt(i))){
if(flag){
newStr = newStr + strSplit[index].charAt(i);
}
flag = false;
}else{
newStr = newStr + strSplit[index].charAt(i);
}
}
System.out.println(newStr);
return newStr.replace("^([0-9]+-*)","");
}
}
可以发现Java实现相对简单一点,因为Java中有自带的方法,方便了操作。Java实现的是包含乘法操作的。eval这个方法可以直接将算术表达式转换成一个常规的表达式并计算出结果。