java 四则运算
2013-11-28 21:47
288 查看
package algorithms;
import java.util.Stack;
public class Siping1 {
//给字符串模拟四则运算,例如输入字符串"1+(2-1)*3=",输出4
private Stack<String> ss=new Stack<String>();
/*
* 算出括号里面的值
*/
public Integer caculateString(String cstring){
char[] strs=cstring.toCharArray();
Stack<String> stack=new Stack<String>();
for(int i=0;i<strs.length;i++){
String stackStr=String.valueOf(strs[i]);
if(")".equals(stackStr)){
StringBuffer sb=new StringBuffer();
while(!"(".equals(stack.peek())){
String s1=stack.pop();
sb.insert(0, s1);
}
stack.pop();
//System.out.println(sb.toString());
Integer s=caculate(sb.toString());
stack.push(s.toString());
}else{
stack.push(stackStr);
}
}
StringBuffer sb1=new StringBuffer();
while(!stack.empty()){
String s1=stack.pop();
sb1.insert(0, s1);
}
//System.out.println(sb1);
return caculate(sb1.toString());
}
/*
* 还可以用逆波兰表达式
*/
public Integer caculate(String cstring){
//用两个栈来保存运算符和运算数字
Stack<String> stack=new Stack<String>();
Stack<Integer> stk=new Stack<Integer>();
char[] str=cstring.toCharArray();
StringBuffer sb=new StringBuffer();
for(int i=0;i<str.length;i++){
String string=String.valueOf(str[i]);
if("+-*/".contains(string)){
if(!stack.empty()){
if("+-".contains(string)){
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),stack.pop()));
stack.push(string);
}else{
if("+-".contains(stack.peek())){//表示前面的符号是+-,当前是*/的情况
stack.push(string);//将符号放入栈
stk.push(Integer.valueOf(sb.toString()));
}else{
//表示前面是乘除的情况,不论当前是加减乘除
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),string));
stack.push(string);
}
}
}else{
stack.push(string);
stk.push(Integer.valueOf(sb.toString()));
}
sb=new StringBuffer();
}else{
sb.append(string);
}
}
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),stack.pop()));
while(!stack.empty()){
Integer a=stk.pop();
Integer b=stk.pop();
stk.push(caculate(b,a,stack.pop()));
}
return stk.pop();
}
public Integer caculate(Integer op1,Integer op2,String op){
switch(op.charAt(0)){
case '+':return op1+op2;
case '-':return op1-op2;
case '*':return op1*op2;
case '/':return op1/op2;
default:return null;
}
//return null;
}
public static void main(String[] args){
Siping1 s=new Siping1();
//Integer a=Integer.valueOf("123");
//Stack st=new Stack();
//System.out.println(st.empty());
System.out.println(s.caculateString("12+3*(4+2)-7*2"));
}
}
import java.util.Stack;
public class Siping1 {
//给字符串模拟四则运算,例如输入字符串"1+(2-1)*3=",输出4
private Stack<String> ss=new Stack<String>();
/*
* 算出括号里面的值
*/
public Integer caculateString(String cstring){
char[] strs=cstring.toCharArray();
Stack<String> stack=new Stack<String>();
for(int i=0;i<strs.length;i++){
String stackStr=String.valueOf(strs[i]);
if(")".equals(stackStr)){
StringBuffer sb=new StringBuffer();
while(!"(".equals(stack.peek())){
String s1=stack.pop();
sb.insert(0, s1);
}
stack.pop();
//System.out.println(sb.toString());
Integer s=caculate(sb.toString());
stack.push(s.toString());
}else{
stack.push(stackStr);
}
}
StringBuffer sb1=new StringBuffer();
while(!stack.empty()){
String s1=stack.pop();
sb1.insert(0, s1);
}
//System.out.println(sb1);
return caculate(sb1.toString());
}
/*
* 还可以用逆波兰表达式
*/
public Integer caculate(String cstring){
//用两个栈来保存运算符和运算数字
Stack<String> stack=new Stack<String>();
Stack<Integer> stk=new Stack<Integer>();
char[] str=cstring.toCharArray();
StringBuffer sb=new StringBuffer();
for(int i=0;i<str.length;i++){
String string=String.valueOf(str[i]);
if("+-*/".contains(string)){
if(!stack.empty()){
if("+-".contains(string)){
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),stack.pop()));
stack.push(string);
}else{
if("+-".contains(stack.peek())){//表示前面的符号是+-,当前是*/的情况
stack.push(string);//将符号放入栈
stk.push(Integer.valueOf(sb.toString()));
}else{
//表示前面是乘除的情况,不论当前是加减乘除
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),string));
stack.push(string);
}
}
}else{
stack.push(string);
stk.push(Integer.valueOf(sb.toString()));
}
sb=new StringBuffer();
}else{
sb.append(string);
}
}
stk.push(caculate(stk.pop(),Integer.valueOf(sb.toString()),stack.pop()));
while(!stack.empty()){
Integer a=stk.pop();
Integer b=stk.pop();
stk.push(caculate(b,a,stack.pop()));
}
return stk.pop();
}
public Integer caculate(Integer op1,Integer op2,String op){
switch(op.charAt(0)){
case '+':return op1+op2;
case '-':return op1-op2;
case '*':return op1*op2;
case '/':return op1/op2;
default:return null;
}
//return null;
}
public static void main(String[] args){
Siping1 s=new Siping1();
//Integer a=Integer.valueOf("123");
//Stack st=new Stack();
//System.out.println(st.empty());
System.out.println(s.caculateString("12+3*(4+2)-7*2"));
}
}
相关文章推荐
- 简单的四则运算答题系统(Java版)
- java实现字符串四则运算公式解析工具类
- java 四则运算 栈的实现
- 用java实现计算String类型的四则运算——用栈和后缀表达式实现
- java 四则运算 栈的实现(原文 http://justsee.iteye.com/blog/1125174)
- java中四则运算计算器
- Java 四则运算表达式求解
- java第二周作业--实现分数的四则运算
- 结对编程——paperOne基于java的四则运算 功能改进
- 小学生四则运算出题程序 无操作界面java版 简单的运用java中一些基本操作
- java四则运算生成器
- java 中使用BigDecimal进行数的四则运算
- java 四则运算 栈的实现
- java 四则运算,并可完成 自定义函数 表达式 功能
- java 解析四则混合运算表达式并计算结果
- Java四则运算总结
- 栈的应用--四则运算表达式求值(java语言)
- 大数的四则运算之除法----Java代码实现
- Java 执行四则运算
- java实现一个整数和一个小数的四则运算和求最大值,平均值。