字符串处理题分别使用C和Java实现

题目:<表达式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这个方法可以直接将算术表达式转换成一个常规的表达式并计算出结果。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值