一、题目描述:
给你一个合法的算术表达式,只包含整数和加号,减号。但整数不一定都是十进制的数,可能是八进制,十六进制,规定包含前缀0x的是十六进制,包含前缀0的是八进制,其他情况是十进制。现在你能计算出这个式子的最终的值吗?
说明:输入的表达式式子只会是整数+(-) 整数 +(-) 整数...... + (-)整数
保证给定的整数不会超过16位(保罗前缀0或者前缀0x)
二、样例输入:
输入有且只有一行,是一个字符串,保证是合法的表达式式子
027555+692+0xD32C
三、样例输出:
输出十进制结果:
-41227
四、问题分析:
1、输入是一个字符串,所以我们首先考虑对字符串按符号进行截断处理:
使用char[] lineChar = line.toCharArray(); 将字符串转换成char类型的数组;
对数组进行遍历,判断如果不是+/- ,则使用str.append()追加该字符,
如果遇到是+/-,将符号入符号栈,将str入数字栈,str重新赋值为空;
直至数组遍历完成!
2、现在我们有两个栈,一个是数字栈,一个是符号栈。对于数字栈我们需要挨个pop()出并将
8进制数和16进制数都转换成十进制数,Integer.parseInt(original.pop().substring(2),16)
Integer.parseInt(original.pop().substring(2),8), 并将十进制数再次入新栈(正式用于计算)
3、现在我们的数字栈里的数是可以直接参与计算的。我们将数字栈和符号栈里面的内容按
数字+/-数字+-数字......+/-数字的顺序出栈,进行计算,得到最终结果!
五、代码实现:(java版本)
package test;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
/**
*
* @author FHY
*
* 简单表达式计算
*/
public class zhaoFangT1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String line = scan.nextLine();
line = line+"#"; //判断结尾
char[] lineChar = line.toCharArray();
int result = getCompute(lineChar);
}
private static int getCompute(char[] lineChar) {
Stack<String> original = new Stack<String>();
Stack<Integer> back = new Stack<Integer>();
ArrayList<Character> opeList = new ArrayList<Character>();
StringBuffer eachNum = new StringBuffer() ;
for(int i=0; i<lineChar.length; i++){
if(lineChar[i]=='#'){
System.out.println(eachNum.toString());
original.push(eachNum.toString());
}else if(lineChar[i]!='+' && lineChar[i]!='-'){
eachNum.append(lineChar[i]);
}else{
System.out.println(eachNum.toString());
original.push(eachNum.toString());
opeList.add(lineChar[i]);
eachNum = new StringBuffer();
}
}
while(!original.isEmpty()){
if(original.peek().startsWith("0x")){
back.push(Integer.parseInt(original.pop().substring(2),16));
}else if(original.peek().startsWith("0")){
back.push(Integer.parseInt(original.pop().substring(1),8));
}else{
back.push(Integer.parseInt(original.pop()));
}
}
int sum = back.pop();
int count = 0;
while(!back.isEmpty() && count<opeList.size()){
sum = (Character)opeList.get(count)=='+' ? back.pop()+sum : sum-back.pop();
count++;
}
return sum;
}
}
六、说明:
该代码并没有进行完善的测试,如果有什么问题,欢迎大家批评指正!共同进步!