<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
    /**
     * 
     
    */
    package com.yovn.algo;

    import java.util.Stack;
    import java.util.Vector;

    /**
     * 
    @author yovn
     *
     
    */
    public class Caculator {

        
        
    class Item
        {
            
    boolean ops;
            
    int value;
            
            Character opVal;
            
    int opPriority;
        }
        
        Stack
    <Item> opStack=new Stack<Item>();
        Vector
    <Item> calcStack=new Vector<Item>();
        
    /**
         * 
         
    */
        
    public Caculator() {
            
    // TODO Auto-generated constructor stub
        }
        
        
        
        
        
    public int calc()
        {
            Stack
    <Item> tmp=new Stack<Item>();
            
    while(!calcStack.isEmpty())
            {
                Item it
    =calcStack.remove(0);
                
                
    if(!it.ops)
                {
                    tmp.push(it);
                }
                
    else
                {
                    
    int op2=tmp.pop().value;
                    
    int op1=tmp.pop().value;
                    Item newItem
    =new Item();
                    newItem.ops
    =true;
                    
    switch(it.opVal)
                    {
                    
    case '+':
                        newItem.value
    =op1+op2;
                        
                        
    break;
                    
    case '-':
                        newItem.value
    =op1-op2;
                        
    break;
                    
    case '*':
                        
                        newItem.value
    =op1*op2;
                        
    break;
                    
    case '/':
                        newItem.value
    =op1/op2;
                        
    break;
                    }
                    tmp.push(newItem);
                }
            }
            
    return tmp.pop().value;
        }
        
    /**
         * 1)數字直接輸出
         * 2)開括號則壓棧
         * 3)閉括號把棧中元素依次輸出直到遇到開括號
         * 4)運算符時
         *     a)循環,當棧非空,并且棧頂元素不是開括號,并且棧頂運算符優先級不低于輸入的運算符的優先級,反復將其輸出
         *     b)把輸入運算符壓棧
         * 5)輸出棧內剩余元素
         * 
    @param in
         * 
    @return
         
    */
        
    public String transInfixToPosfix(String in)
        {
            
    char[] cin=in.toCharArray();
            StringBuffer buffer
    =new StringBuffer();
           
            
    for(int i=0;i<cin.length;i++)
            {
                Item newItem
    =new Item();
                newItem.opPriority
    =1;
                newItem.ops
    =false;
                
                
    switch(cin[i])
                {
                
                
    case '+':
                    newItem.opPriority
    =1;
                    newItem.ops
    =true;
                    newItem.opVal
    ='+';
                    doOps(buffer, newItem);
                    
                    
    break;
                
    case '-':
                    newItem.opPriority
    =1;
                    newItem.ops
    =true;
                    newItem.opVal
    ='-';
                    doOps(buffer, newItem);
                    
    break;
                
    case '*':
                    newItem.opPriority
    =2;
                    newItem.ops
    =true;
                    newItem.opVal
    ='*';
                    doOps(buffer, newItem);
                    
    break;
                
    case '/':
                    newItem.opPriority
    =2;
                    newItem.ops
    =true;
                    newItem.opVal
    ='/';
                    doOps(buffer, newItem);
                    
    break;
                    
                
    case '(':
                    newItem.ops
    =true;
                    newItem.opVal
    ='(';
                    opStack.push(newItem);
                    
                    
    break;
                
    case ')':
                    
    boolean meetClose=false;
                    
    while(!opStack.isEmpty())
                    {
                        Item item
    =opStack.peek();
                        
    if(item.ops&&item.opVal!='(')
                        {
                            calcStack.add(item);
                            opStack.pop();
                            buffer.append(item.opVal);
                        }
                        
    else if(item.ops)
                        {
                            opStack.pop();
                            meetClose
    =true;
                            
    break;
                        }
                    }
                    
    if(!meetClose)
                    {
                        
    throw new RuntimeException();
                    }
                    
    break;
                    
                
    default:
                    
    int j=i;
                    
    for(;j<cin.length&&cin[j]>='0'&&cin[j]<='9';j++);
                    
    if(j==i)
                    {
                        
    throw new RuntimeException("wrong input.");
                    }
                    newItem.ops
    =false;
                    newItem.value
    =Integer.parseInt(new String(cin,i,j-i));
                    buffer.append(newItem.value);
                    calcStack.add(newItem);
                    i
    =j-1;
                    
    break;
                    
                    
                }
            }
            
    while(!opStack.isEmpty())
            {
                Item item
    =opStack.pop();
                calcStack.add(item);
                buffer.append(item.opVal);
                
            }
            
    return buffer.toString();
            
        }



        
    private void doOps(StringBuffer buffer, Item newItem) {
            
    while(!opStack.isEmpty())
            {
                Item item
    =opStack.peek();
                
    if(item.opVal!='('&&item.opPriority>=newItem.opPriority)
                {
                    calcStack.add(item);
                    opStack.pop();
                    buffer.append(item.opVal);
                }
                
    else
                {
                    
    break;
                }
            }
            opStack.push(newItem);
        }
        

        
    /**
         * 
    @param args
         
    */
        
    public static void main(String[] args) {
            Caculator calc
    =new Caculator();
            
            System.out.println(
    "1+2*3+7-(4/2+8)/5="+calc.transInfixToPosfix("1+2*3+7-(4/2+8)/5"));
            System.out.println(
    "value is:"+calc.calc());

        }

    }
    posted on 2007-10-09 22:48 DoubleH 閱讀(996) 評論(1)  編輯  收藏 所屬分類: Memorandum

    Feedback

    # re: 表達式求值Java粗糙版 2007-12-20 21:45 sitinspring
    以后要多來看看.  回復  更多評論
      

    主站蜘蛛池模板: 亚洲狠狠成人综合网| 亚洲人成网址在线观看| 亚洲综合av一区二区三区| 久久WWW免费人成一看片| 亚洲图片在线观看| 最近最新高清免费中文字幕| 亚洲人成电影亚洲人成9999网| 99热在线精品免费播放6| 亚洲精品视频观看| 97人妻无码一区二区精品免费| 中文字幕 亚洲 有码 在线| 两性刺激生活片免费视频| 亚洲熟妇AV一区二区三区浪潮| 好大好硬好爽免费视频| 亚洲爆乳大丰满无码专区| 免费人成年轻人电影| 在线免费播放一级毛片| 亚洲国产综合专区电影在线| **一级一级毛片免费观看| 亚洲精品中文字幕| 亚洲?V无码成人精品区日韩| 在线免费播放一级毛片| 亚洲精品动漫在线| 宅男666在线永久免费观看| eeuss免费影院| 亚洲国产成人久久精品动漫 | 亚洲一区二区三区91| 国语成本人片免费av无码| 风间由美在线亚洲一区| 亚洲热线99精品视频| 亚洲视频免费一区| 最新亚洲人成无码网站| 亚洲人成图片小说网站| 2019中文字幕在线电影免费| 亚洲精品无码成人| 亚洲中文字幕久久精品无码APP | 国产午夜免费福利红片| 国产美女视频免费观看的网站| 亚洲国产人成在线观看| 国产国产人免费视频成69大陆| 黄页免费在线观看|