朴素法求解字符串表达式
package AlogPub.first;
public class StringExpression {
private int anwser;
private int[] num;
private char[] exp;
private char[] expression;
public StringExpression(char[] car){
this.expression=car;
this.num=new int[car.length/2+1];
this.exp=new char[car.length/2];
}
private void add_sub(){
this.anwser=num[0];
for (int i = 0; i < exp.length; i++) {
if(exp[i]=='+'){
this.anwser+=num[i+1];
}
if(exp[i]=='-'){
this.anwser-=num[i+1];
}
}
}
private void multiply(){
int j=0;
for (int i = 0; i < exp.length; i++) {
if(exp[i]!='*' && exp[i]!='/'){
j=0;
continue;
}
if(exp[i]=='*'){
num[i-j]*=num[i+1];
}
j++;
}
}
private void separate(){
int j=0;
int k=0;
for (int i = 0; i < expression.length; i++) {
if(i%2==0){
num[j++]=expression[i]-'0';
}
if(i%2==1){
exp[k++]=expression[i];
}
}
}
private int calc(){
separate();
multiply();
add_sub();
return this.anwser;
}
public static void main(String[] args) {
String s="9+8*6-7+6";
StringExpression se=new StringExpression(s.toCharArray());
System.out.println(se.calc());
}
}
逆波兰式求解字符串表达式
package AlogPub.first;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class NiBoLan {
public List<String> ChangeToNiBoLan(String str){
Stack<String> stack=new Stack<>();
String[] cs=stringToCharArray(str);
List<String> resList=new ArrayList<>();
for (int i = 0; i < cs.length; i++) {
if(cs[i].matches("[0-9]")){
StringBuilder sb=new StringBuilder();
while((i)<str.length()&&cs[i].matches("[0-9]")){
sb.append(cs[i]);
i++;
}
i--;
resList.add(sb.toString());
}else{
if("(".equals(cs[i])){
stack.push(cs[i]);
}else if(")".equals(cs[i])){
while(true){
if("(".equals(stack.peek())){
stack.pop();
break;
}else{
resList.add(stack.pop());
}
}
}else{
while(true){
if(stack.isEmpty()){
stack.push(cs[i]);
break;
}else if("(".equals(stack.peek())){
stack.push(cs[i]);
break;
}else {
if(numPri(cs[i])>numPri(stack.peek())){
stack.push(cs[i]);
break;
}else{
if(numPri(cs[i])<=numPri(stack.peek())){
resList.add(stack.pop());
}else{
resList.add(cs[i]);
break;
}
}
}
}
}
}
}
while(!stack.isEmpty()){
resList.add(stack.pop());
}
return resList;
}
public Double cala(List<String> list){
Stack<Double> opr=new Stack<>();
list.forEach(v->{
if(v.matches("[0-9]{1,}")){
opr.push(Double.valueOf(v));
}else{
opr.push(jisuan(opr.pop(),opr.pop(), v));
}
});
return opr.pop();
}
public Double jisuan(Double a,Double b,String exp){
if("*".equals(exp)){
return b*a;
}else if("/".equals(exp)){
return b/a;
}else if("+".equals(exp)){
return a+b;
}else{
return b-a;
}
}
public String[] stringToCharArray(String str){
char[] cs=str.toCharArray();
String[] res=new String[str.length()];
for (int i = 0; i < res.length; i++) {
res[i]=cs[i]+"";
}
return res;
}
private int numPri(String num){
if("+".equals(num)||"-".equals(num)){
return 0;
}else{
return 1;
}
}
public static void main(String[] args) {
String str="288-3*(15+6)";
NiBoLan niBoLan= new NiBoLan();
String[] strings= niBoLan.stringToCharArray(str);
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
System.out.println("========");
List<String> list= niBoLan.ChangeToNiBoLan(str);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
Double d= niBoLan.cala(list);
System.out.println(d);
}
}