<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
    以后要多來看看.  回復  更多評論
      

    主站蜘蛛池模板: 成人无码精品1区2区3区免费看| 亚洲aⅴ天堂av天堂无码麻豆| 国产免费福利体检区久久| 免费日本黄色网址| 美女又黄又免费的视频| 四虎影在线永久免费四虎地址8848aa| 亚洲啪AV永久无码精品放毛片| 嫩草视频在线免费观看| 久久久久久亚洲精品无码| 免费日韩在线视频| 中文字幕免费在线看电影大全 | 国产亚洲精品线观看动态图| 免费国产污网站在线观看不要卡| 亚洲成av人片天堂网老年人| 色婷婷综合缴情综免费观看| 亚洲午夜国产精品无码| 久久国产乱子伦精品免费强| 亚洲短视频在线观看| 一个人看的www在线观看免费| 中文字幕乱码亚洲精品一区| 国产又黄又爽又刺激的免费网址| 国产va免费精品| 久久亚洲国产成人精品性色| 四虎影院免费视频| 99精品视频在线观看免费| 噜噜噜亚洲色成人网站∨| 免费观看大片毛片| 国产免费黄色无码视频| 亚洲精品mv在线观看| 国产精品二区三区免费播放心| 久久国产精品免费一区| 亚洲欧洲日本国产| 全亚洲最新黄色特级网站| 久久国产精品一区免费下载| 亚洲精品第一综合99久久| 国产偷国产偷亚洲清高动态图| 51精品视频免费国产专区| 黄色毛片免费在线观看| 亚洲精品白色在线发布| 亚洲毛片av日韩av无码| 成人免费视频网站www|