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

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

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

    waysun一路陽光

    不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實實做事,認認真真做人。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
    轉自:http://www.tkk7.com/javacap/archive/2007/10/09/151566.html
    /**
     * 
     
    */
    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 2009-04-15 22:05 weesun一米陽光 閱讀(193) 評論(0)  編輯  收藏 所屬分類: 總結備用
    主站蜘蛛池模板: 18女人水真多免费高清毛片| 亚洲AV网一区二区三区| 久久香蕉国产线看观看亚洲片| 亚洲日韩精品无码专区网站 | 亚洲性无码一区二区三区| 亚洲成人福利网站| 亚洲精品在线免费观看视频| 亚洲欧洲日产专区| 亚洲欧洲国产成人精品| 亚洲人妖女同在线播放| 亚洲一区二区影视| 亚洲最大无码中文字幕| 亚洲精品无码日韩国产不卡av| 亚洲av日韩综合一区久热| 色偷偷亚洲男人天堂| 粉色视频成年免费人15次| 一级毛片免费播放试看60分钟| 中文字幕免费在线看电影大全 | 免费精品99久久国产综合精品| 无码精品人妻一区二区三区免费看| 久久久久免费精品国产小说| 9420免费高清在线视频| 在线观看免费人成视频| 午夜无遮挡羞羞漫画免费| 免费a级黄色毛片| 亚洲精品二区国产综合野狼 | 国产无遮挡吃胸膜奶免费看| 亚洲成网777777国产精品| 亚洲精品成人片在线观看精品字幕 | 18禁美女裸体免费网站| 免费人成视频在线| 亚洲成a人一区二区三区| 久久亚洲成a人片| 亚洲a∨无码男人的天堂| 久久亚洲欧美国产精品| 中文字幕无线码中文字幕免费| 中文字幕免费视频一| 免费a级毛片无码a∨蜜芽试看| 亚洲AV无码成人精品区大在线| 国产精品亚洲A∨天堂不卡| 久久夜色精品国产噜噜亚洲AV|