| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 514 人关注过本帖
标题:关于栈,来看看
只看楼主 加入收藏
zhy618
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-9-10
收藏
 问题点数:0 回复次数:3 
关于栈,来看看

这是则分数运算代码,应用栈的思想.但很多部分不是太懂,那位高手可以解释一下,在用C++实现分数计算器的时候,如何进行最关键部分计算.打个比方,如果输入的是1/2+(5/2-4/2)*1/2^2/1 我们写代码一般是把他存入一个CHAR 数组中,再通过栈的手段进行运算,但改为分数后,程序是不是还可以这样进行??我已经定义了一个分数类..

请教各位高手!谢谢

{Program : ji suan a biao da shi by fen shu} {StartTime : 14/11/2003} {By : BryantTjm} {FinishedTime : 14/11/2003} PROGRAM CountByFenShu; TYPE MyNumber = Record zi : Longint ; mu : Longint END; LableType = SET OF Char; CONST LableNo : ARRAY [ 1..2] OF LableType =( ['+' , '-'],['*' , '/'] ); VAR data : String; answer : MyNumber; {*} PROCEDURE InputData; BEGIN Writeln; Writeln; Writeln( 'INPUT' ); Write(' '); Readln( data ) END; {InputData} {*} PROCEDURE GoSwap ( VAR x,y : Longint); VAR temp : Longint; BEGIN temp := x; x := y; y := temp END; {Swap} FUNCTION Gcd ( x,y : Longint) : Longint; VAR r : Longint; BEGIN x := abs(x); y := abs(y); While y>0 DO BEGIN r := x MOD y; x := y; y := r END; Gcd:=x END; {Gcd} FUNCTION Lcm ( x,y : Longint) : Longint; BEGIN Lcm := x * y DIV Gcd(x,y) END; {Lcm} PROCEDURE YueFen (VAR zi,mu : Longint); VAR GcdMuZi : Longint; BEGIN GcdMuZi := Gcd (mu,zi); mu := mu DIV GcdMuZi; zi := zi DIV GcdMuZi END; {YueFen} PROCEDURE HuaJian ( VAR x : MyNumber ); BEGIN YueFen (x.zi , x.mu) END; {HuaJian} PROCEDURE ChangeIntegerToMyNumber ( x : Longint; Var ans : MyNumber ); BEGIN ans.zi:=x; ans.mu:=1 END; {ChangeInteterToMynumber} PROCEDURE MyJia ( CONST x,y : MyNumber; VAR ans : MyNumber ); VAR LcmMuXY , ForX , ForY : Longint; BEGIN LcmMuXY := Lcm (x.mu , y.mu); ForX := LcmMuXY DIV x.mu; ForY := LcmMuxy DIV y.mu; ans.mu := LcmMuXy; ans.zi := x.zi * ForX + y.zi * ForY; HuaJian (ans) END; {MyJia} PROCEDURE MyJian ( x,y : MyNumber; VAR ans : MyNumber ); BEGIN y.zi := - y.zi; MyJia ( x , y, ans ) END; { MyJian } PROCEDURE MyCheng ( x,y : MyNumber; VAR ans : MyNumber ); BEGIN YueFen (x.zi , y.mu); YueFen (y.zi , x.mu); ans.mu := x.mu * y.mu; ans.zi := x.zi * y.zi; HuaJian ( ans ) END; {MyCheng} PROCEDURE MyChu ( x,y : MyNumber; VAR ans : MyNumber ); BEGIN GoSwap ( y.zi , y.mu ); MyCheng ( x , y, ans) END; {MyChu} {*} FUNCTION FindTheLable ( thedata :String; x : LableType) : Byte; VAR i , long , KuoHao : Byte; ok : Boolean; BEGIN long := Length( thedata ); i := long; KuoHao := 0; ok := False; WHILE (i >=2 ) AND Not ok DO BEGIN CASE thedata[i] OF '(' : Inc ( KuoHao ); ')' : Dec ( KuoHao ) ELSE IF (KuoHao=0) AND ( thedata[i] in x ) THEN ok := True END; {CASE} IF Not ok Then Dec(i) END; {WHILE} IF ok THEN FindTheLable := i ELSE FindTheLable := 0; END; {FindTheLable} {*} PROCEDURE GetLeftAndRight ( Const TheData : String; Mid : Byte ; VAR left_ans , right_ans : String); BEGIN left_ans := Copy ( TheData , 1 , Mid-1 ); right_ans := Copy ( TheData , Mid+1 , Length( TheData ) -1 ) END; {GetLeftAndRight} {*} PROCEDURE DeleteKuoHao ( VAR x : String ); VAR KuoHao , i , long: Byte; OkToExit : Boolean; BEGIN long := Length(x); IF long<2 THEN Exit; OkToExit := False; KuoHao := 0; REPEAT i := 0; REPEAT Inc(i); CASE x[i] OF '(' : Inc ( KuoHao ); ')' : Dec ( KuoHao ) END UNTIL ( KuoHao = 0); IF i = long THEN BEGIN x := Copy (x,2,long-2); dec(long,2) END ELSE OkToExit := true UNTIL (long<2) OR OkToExit END; {DeleteKuoHao} {*} PROCEDURE MakeTheBiaoDaShi ( TheData : String; VAR ans : MyNumber); VAR Mid : Byte; k : Longint; i :Integer; LeftData , RightData : String; LeftOut , RightOut : MyNumber; BEGIN DeleteKuoHao ( TheData ); Mid := FindTheLable ( TheData , LableNo[1] ); IF Mid = 0 Then Mid := FindTheLable ( TheData , LableNo[2] ); IF Mid > 0 THEN BEGIN GetLeftAndRight ( TheData , Mid , LeftData , RightData ); MakeTheBiaoDaShi ( LeftData , LeftOut ); MakeTheBiaoDaShi ( RightData , RightOut ); CASE TheData [Mid] OF '+' : MyJia ( LeftOut , RightOut , ans ); '-' : MyJian ( LeftOut , RightOut , ans ); '*' : MyCheng ( LeftOut , RightOut , ans); '/' : MyChu ( LeftOut , RightOut , ans) END {CASE} END {IF} ELSE BEGIN Val( TheData , k , i); ChangeIntegerToMyNumber( k , ans) END {ELSE} END; {MakeTheBiaoDaShi} PROCEDURE ChangeToDaiFenShu ( CONST data : MyNumber; VAR x,y,z : Longint ); BEGIN WITH data Do BEGIN x := zi DIV mu; y := zi MOD mu; z := mu END END; {ChangeToDaiFenShu} {*} PROCEDURE PrintMyNumber ( x : MyNumber ); VAR i , j , k : Longint; BEGIN write('='); IF x.zi = 0 THEN Write(0) ELSE BEGIN ChangeToDaiFenShu ( x , i , j , k); IF i<>0 THEN BEGIN Write(i,' '); j := Abs (j); IF k>1 THEN Write('& ') END; {IF} IF k>1 THEN Write(j,'/',k) END; Writeln END; {PrintMyNumber} { Main } BEGIN InputData; MakeTheBiaoDaShi ( data , answer ); PrintMyNumber ( answer ); Readln END. {Main}

搜索更多相关主题的帖子: 计算器 color 如何 
2005-10-03 11:19
真的好!
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-10-4
收藏
得分:0 
太长了
看不动啊,还是顶一个吧
2005-10-05 00:56
wulidress
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2005-8-9
收藏
得分:0 
小姐你是不是应该发在数据结构里啊   服气了呵呵
2005-10-07 21:10
枕头
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-10-9
收藏
得分:0 
没有注解的程序不是程序.
看不懂!!!!

2005-10-09 19:17
快速回复:关于栈,来看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016310 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved