逆波兰式算法java

本文介绍了一种基于逆波兰式的表达式计算方法,并提供了一个Java实现的例子。该方法首先将中序表达式转换为逆波兰式(后缀表达式),然后利用栈进行计算。文章详细展示了代码结构,包括栈的操作、表达式的转换及最终结果的计算。
摘要由CSDN通过智能技术生成

表达式运算,网上查了一下java有源代码。不过问题太多。而且都是一个版本。

根本没法使用。

逆波兰式算法主要的设计思路是把一般的中序表达式变为右序表达式

例子1+2-5*(5-4)*6-(6-1)

把上面的表达式转化为:

 12+554-*6*-61--

然后通过栈再来计算。

具体的理论网上找找逆波兰式

根据人家的版本进行了修改。

package  expression1;     
import  java.util. * ;     
// 栈类     
public   class  Stacks {     
   
private LinkedList list=new LinkedList();     
   
int top=-1;     
   
public void push(Object value){     
      top
++;     
      list.addFirst(value);     
   }
     
   
public Object pop(){     
      Object temp
=list.getFirst();     
      top
--;     
      list.removeFirst();     
      
return temp;     
   
   }
     
   
public Object top(){     
   
return list.getFirst();     
   }
     
}
     

 

 

 

package  expression1;    
   
import  java.io. * ;    
import  java.util. * ;    
   
public   class  Expression  {    
    
private ArrayList expression = new ArrayList();// 存储中序表达式    
   
    
private ArrayList right = new ArrayList();// 存储右序表达式    
   
    
private String result;// 结果    
   
    
// 依据输入信息创建对象,将数值与操作符放入ArrayList中    
    private Expression(String input) {    
        StringTokenizer st 
= new StringTokenizer(input, "+-*/()"true);    
        
while (st.hasMoreElements()) 
            String s
=st.nextToken();
            expression.add(s);
        }

    }

   
    
// 将中序表达式转换为右序表达式
    private void toRight() 
        Stacks aStack 
= new Stacks();  
        String operator;
        
int position = 0;
        
while (true{
            
if (Calculate.isOperator((String) expression.get(position))) {    
                
if (aStack.top == -1   
                        
|| ((String) expression.get(position)).equals("(")) {    
                    aStack.push(expression.get(position));    
                }
 else {    
                    
if (((String) expression.get(position)).equals(")")) {  
                        
while(true){
                        
                            
if (aStack.top != -1&&!((String) aStack.top()).equals("(")) {    
                                operator 
= (String) aStack.pop();
                                right.add(operator);    
                            }
else{
                                
if(aStack.top != -1)
                                    aStack.pop();
                                
break;
                            }
   
                        }
 
                    }
 else {  
                        
while(true){
                            
if (aStack.top != -1&&Calculate.priority((String) expression    
                                    .get(position)) 
<= Calculate    
                                    .priority((String) aStack.top())    
                                    ) 
{    
                                operator 
= (String) aStack.pop(); 
                                
if (!operator.equals("("))    
                                    right.add(operator);    
                            }
else{
                                
break;
                            }
    
                            
                        }
 
                        aStack.push(expression.get(position));
                    }
    
                }
    
            }
 else   
                right.add(expression.get(position));    
            position
++;    
            
if (position >= expression.size())    
                
break;    
        }
    
        
while (aStack.top != -1{    
            operator 
= (String) aStack.pop();  
            
if(!operator.equals("("))  
                right.add(operator);    
        }
    
    }
    
   
    
// 对右序表达式进行求值    
    private void getResult() {    
        
this.toRight();
        
for(int i=0;i<right.size();i++){
            System.out.println(right.get(i));  
        }
    
        Stacks aStack 
= new Stacks();    
        String op1, op2, is 
= null;    
        Iterator it 
= right.iterator();    
   
        
while (it.hasNext()) {    
            is 
= (String) it.next();    
            
if (Calculate.isOperator(is)) {    
                op1 
= (String) aStack.pop();    
                op2 
= (String) aStack.pop();    
                aStack.push(Calculate.twoResult(is, op1, op2));    
            }
 else   
                aStack.push(is);    
        }
    
        result 
= (String) aStack.pop();    
        it 
= expression.iterator();    
        
while (it.hasNext()) {    
            System.out.print((String) it.next());    
        }
    
        System.out.println(
"=" + result);    
    }
    
   
    
public static void main(String avg[]) {    
        
try {    
            System.out.println(
"Input a expression:");    
            BufferedReader is 
= new BufferedReader(new InputStreamReader(    
                    System.in));    
            
for (;;) {    
                String input 
= new String();    
                input 
= is.readLine().trim();    
                
if (input.equals("q"))    
                    
break;    
                
else {    
                    Expression boya 
= new Expression(input);    
                    boya.getResult();    
                }
    
                System.out    
                        .println(
"Input another expression or input 'q' to quit:");    
            }
    
            is.close();    
        }
 catch (IOException e) {    
            System.out.println(
"Wrong input!!!");    
        }
    
    }
    
}
    

 

 

ackage expression1;    
   
public   class  Calculate  {    
    
// 判断是否为操作符号    
    public static boolean isOperator(String operator) {    
        
if (operator.equals("+"|| operator.equals("-")    
                
|| operator.equals("*"|| operator.equals("/")    
                
|| operator.equals("("|| operator.equals(")"))    
            
return true;    
        
else   
            
return false;    
    }
    
   
    
// 设置操作符号的优先级别    
    public static int priority(String operator) {    
        
if (operator.equals("+"|| operator.equals("-"))    
            
return 1;  
        
else if (operator.equals("*"|| operator.equals("/"))    
            
return 2;    
        
else   
            
return 0;    
    }
    
   
    
// 做2值之间的计算    
    public static String twoResult(String operator, String a, String b) {    
        
try {    
            String op 
= operator;    
            String rs 
= new String();    
            
double x = Double.parseDouble(b);    
            
double y = Double.parseDouble(a);    
            
double z = 0;    
            
if (op.equals("+"))    
                z 
= x + y;    
            
else if (op.equals("-"))    
                z 
= x - y;    
            
else if (op.equals("*"))    
                z 
= x * y;    
            
else if (op.equals("/"))    
                z 
= x / y;    
            
else   
                z 
= 0;    
            
return rs + z;    
        }
 catch (NumberFormatException e) {    
            System.out.println(
"input has something wrong!");    
            
return "Error";    
        }
    
    }
    
}
    

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值