[題目分析]逆波蘭表達式(即後綴表達式)求值規則如下設立運算數棧OPND對表達式從左到右掃描(讀入)當表達式中掃描到數時壓入OPND棧當掃描到運算符時從OPND退出兩個數進行相應運算結果再壓入OPND棧這個過程一直進行到讀出表達式結束符$這時OPND棧中只有一個數就是結果
float expr( )
//從鍵盤輸入逆波蘭表達式以$表示輸入結束本算法求逆波蘭式表達式的值
{float OPND[]; // OPND是操作數棧
init(OPND); //兩棧初始化
float num=; //數字初始化
scanf (%c&x);//x是字符型變量
while(x!=$)
{switch
{case<=x<=:while((x>=&&x<=)||x==) //拼數
if(x!=) //處理整數
{num=num*+(ord(x)ord()); scanf(%c&x);}
else //處理小數部分
{scale=; scanf(%c&x);
while(x>=&&x<=)
{num=num+(ord(x)ord()/scale;
scale=scale*; scanf(%c&x); }
}//else
push(OPNDnum); num=;//數壓入棧下個數初始化
case x= :break; //遇空格繼續讀下一個字符
case x=+:push(OPNDpop(OPND)+pop(OPND));break;
case x=:x=pop(OPND);x=pop(OPND);push(OPNDxx);break;
case x=*:push(OPNDpop(OPND)*pop(OPND));break;
case x=/:x=pop(OPND);x=pop(OPND);push(OPNDx/x);break;
default: //其它符號不作處理
}//結束switch
scanf(%c&x);//讀入表達式中下一個字符
}//結束while(x!=$)
printf(後綴表達式的值為%fpop(OPND));
}//算法結束
[算法討論]假設輸入的後綴表達式是正確的未作錯誤檢查算法中拼數部分是核心若遇到大於等於且小於等於的字符認為是數這種字符的序號減去字符的序號得出數對於整數每讀入一個數字字符前面得到的部分數要乘上再加新讀入的數得到新的部分數當讀到小數點認為數的整數部分已完要接著處理小數部分小數部分的數要除以(或的冪數)變成十分位百分位千分位數等等與前面部分數相加在拼數過程中若遇非數字字符表示數已拼完將數壓入棧中並且將變量num恢復為准備下一個數這時對新讀入的字符進入+*/及空格的判斷因此在結束處理數字字符的case後不能加入break語句
[] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/sjjg/201311/22705.html