java 实现带括号的加减乘除四则运算
2013-05-28 09:48
513 查看
package d;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class A {
public static Map pro=new HashMap();
public static void init()
{
pro.put('+', 1);
pro.put('-', 1);
pro.put('*', 2);
pro.put('/', 2);
}
public static int getIndex(String str)
{
int index1=(str.indexOf('+')==-1?str.length():str.indexOf('+'));
int index2=(str.indexOf('-')==-1?str.length():str.indexOf('-'));
int index3=(str.indexOf('*')==-1?str.length():str.indexOf('*'));
int index4=(str.indexOf('/')==-1?str.length():str.indexOf('/'));
int index=index1<index2?index1:index2;
index=index<index3?index:index3;
index=index<index4?index:index4;
return index;
}
public static double cal(char op,double num1,double num2)
{
switch(op)
{
case '+':
return num1+num2;
case '-':
return num1-num2;
case '*':
return num1*num2;
default:
return num1/num2;
}
}
public static double fun1(String str)
{
init();
Stack st1=new Stack();
Stack st2=new Stack();
int fop=0;
while(str.length()>0)
{
int index=getIndex(str);
st1.push(Double.parseDouble(str.substring(0,index)));
if(index!=str.length())
{
char op=str.charAt(index);
str=str.substring(index+1);
while(true)
{
if((int)pro.get(op)>fop)
{
st2.push(op);
fop=(int)pro.get(op);
break;
}
else
{
double num2= (double) st1.pop();
double num1=(double) st1.pop();
double result=cal((char)st2.pop(),num1,num2);
st1.push(result);
if(st2.size()==0)
{
st2.push(op);
fop=(int)pro.get(op);
break;
}
char cop=(char) st2.pop();
fop=(int)pro.get(cop);
st2.push(cop);
}
}
}
else
{
break;
}
}
while(st2.size()!=0)
{
double num2=(double) st1.pop();
double num1=(double) st1.pop();
char op=(char) st2.pop();
st1.push(cal(op,num1,num2));
}
double result=(double) st1.pop();
return result;
}
public static double fun2(String str)
{
while(str.indexOf('(')!=-1)
{
int left=0;
int right=str.length();
char op;
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)=='(')
{
left=i;
}
if(str.charAt(i)==')')
{
right=i;
break;
}
}
str=str.substring(0,left)+fun1(str.substring(left+1,right))+str.substring(right+1);
}
return fun1(str);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="1.0*4*5/2+2*3+4+5-4+3*2";
String str1="((1+2*(3+4*(2+3)))+2*(3+5))*(3+4)-33+5";
double result=fun2(str1);
System.out.println(result);
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class A {
public static Map pro=new HashMap();
public static void init()
{
pro.put('+', 1);
pro.put('-', 1);
pro.put('*', 2);
pro.put('/', 2);
}
public static int getIndex(String str)
{
int index1=(str.indexOf('+')==-1?str.length():str.indexOf('+'));
int index2=(str.indexOf('-')==-1?str.length():str.indexOf('-'));
int index3=(str.indexOf('*')==-1?str.length():str.indexOf('*'));
int index4=(str.indexOf('/')==-1?str.length():str.indexOf('/'));
int index=index1<index2?index1:index2;
index=index<index3?index:index3;
index=index<index4?index:index4;
return index;
}
public static double cal(char op,double num1,double num2)
{
switch(op)
{
case '+':
return num1+num2;
case '-':
return num1-num2;
case '*':
return num1*num2;
default:
return num1/num2;
}
}
public static double fun1(String str)
{
init();
Stack st1=new Stack();
Stack st2=new Stack();
int fop=0;
while(str.length()>0)
{
int index=getIndex(str);
st1.push(Double.parseDouble(str.substring(0,index)));
if(index!=str.length())
{
char op=str.charAt(index);
str=str.substring(index+1);
while(true)
{
if((int)pro.get(op)>fop)
{
st2.push(op);
fop=(int)pro.get(op);
break;
}
else
{
double num2= (double) st1.pop();
double num1=(double) st1.pop();
double result=cal((char)st2.pop(),num1,num2);
st1.push(result);
if(st2.size()==0)
{
st2.push(op);
fop=(int)pro.get(op);
break;
}
char cop=(char) st2.pop();
fop=(int)pro.get(cop);
st2.push(cop);
}
}
}
else
{
break;
}
}
while(st2.size()!=0)
{
double num2=(double) st1.pop();
double num1=(double) st1.pop();
char op=(char) st2.pop();
st1.push(cal(op,num1,num2));
}
double result=(double) st1.pop();
return result;
}
public static double fun2(String str)
{
while(str.indexOf('(')!=-1)
{
int left=0;
int right=str.length();
char op;
for(int i=0;i<str.length();i++)
{
if(str.charAt(i)=='(')
{
left=i;
}
if(str.charAt(i)==')')
{
right=i;
break;
}
}
str=str.substring(0,left)+fun1(str.substring(left+1,right))+str.substring(right+1);
}
return fun1(str);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="1.0*4*5/2+2*3+4+5-4+3*2";
String str1="((1+2*(3+4*(2+3)))+2*(3+5))*(3+4)-33+5";
double result=fun2(str1);
System.out.println(result);
}
}
相关文章推荐
- 用Java位运算实现加减乘除四则运算
- java实现超大整数加减乘除四则运算
- 用栈的知识实现四则运算(带括号的加减乘除)
- 用Java位运算实现加减乘除四则运算
- Java实现简单四则运算
- Java实现-有效的括号序列
- 7. 使用栈实现加减乘除四则运算
- 算术表达式的实现,支持加减乘除,括号运算,表达式转二叉树
- C++简单计算器实现(四则运算加括号)
- 用java实现复数的加减乘除运算
- 汇编实现的加减乘除四则运算
- java实现括号匹配
- java进行字符串与字符串或者字符串与数字进行加减乘除四则运算
- java中FOR循环实现累加、四则运算
- 数据结构与算法分析笔记与总结(java实现)--字符串11:合法括号序列判断练习题
- java实现可有括号的android计算器
- 对如下字符串(234453)[234]{2324}分析它的括号使用是否正确,括号匹配(Java实现)
- 用堆栈实现四则运算(不带括号)、十进制转八进制
- 括号匹配算法的一种正确实现(java)
- 简单加减乘除括号的计算器实现