下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
楼主: 考拉
打印 上一主题 下一主题

有没有人想过怎么用计算机来实现24点

[复制链接]
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    21
    发表于 2004-5-2 15:40:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 15:35:10的发言:
    0 g8 u) `5 c% `& l( ^
    6 J  |  G0 c$ G0 u8 y8 W# Y* e" `6 T9 @( K8 W3 D
    用这个好了,只不过输入的时候要按从小到大
    , E" e. b9 J8 q3 _/ M" S5 {, e1 j2 C$ V1 M& u, x2 p
    好象有BUG,我暂时不太清楚

    - y5 e6 U! v' ^. g4 N1 A) ~ 好象不行啊,我输入 1 2 3 8 结果是 0个算式
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    22
    发表于 2004-5-2 15:46:00 | 只看该作者
    这些重复都是可行的算法,我想了很久,没有办法删除了,+ K- z" h0 {: M& ^2 D6 J- r. O
    比如 1 M2 K, U; [6 u" V4 W7 u$ @& n* _: m( Y
    1*2*3*4
    # z- c* ^8 }0 q9 g: s" L% p% ]2*1*3*4
    & H( O, W; ]+ i/ m" [4*3*2*1
    & X2 ~6 X/ D5 s. G) ~这些都是我们看来是一样的表达算式而已,对程序来说却是完全不同的计算次序,所以还真的难以在算法中高效率的取舍,看来只有在得到所有结果以后在进行一个比较来取舍了。那是比较简单的,不过又多加了步骤,时间也就花得更多。
    * b, T5 F4 }0 V$ S5 d不过如果游戏中不要求写出所有计算方法的话,那么可以在得到第一个算式的时候就停止
    1 n4 w* ]7 h, Z% S" g# {
    : Y1 {, G/ R5 C" u& R3 _$ J" M
    ' ~$ V! F" `: z' F5 F, b: x; C: e0 T! p; n8 v
    + h0 [  Y+ y5 w" n
    [此贴子已经被作者于2004-5-2 15:46:49编辑过]

    5 |% u+ y& {) T$ p8 u

    该用户从未签到

    23
    发表于 2004-5-2 15:50:00 | 只看该作者
    问题挺多了,我要再好好修改一下
    ! P( r7 ^  k9 R4 N( O, t' k
    ) H$ t  `3 b* W% R7 S* e1 r我本来想用波兰表示法进行算术计算的,给搞错了,哈哈$ B! `0 z. c, x- D7 E6 [
    [此贴子已经被作者于2004-5-2 15:53:03编辑过]
    ' |5 P+ n$ h& D: N, k% N
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    24
    发表于 2004-5-2 15:53:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 15:50:48的发言:& c1 D7 w$ D! V) Q
    问题挺多了,我要再好好修改一下# M- B- a& E6 q9 b) D+ I" w0 \
    - Y( P7 M- R; B6 b
    我本来想用波兰表示法进行算术计算的,给搞错了,哈哈; R9 q" L; H* Z
    # P# k. V3 d6 g& Z( I. y' L4 C
    还写啊?这么有空,建议帮我把vb的改成c的吧,优化优化,那真的可以写个小游戏了哦  
    % K9 j* q9 {- D2 g; L8 d
    8 ~: L6 d5 ~4 G2 @( ^/ J5 B* i) h9 E2 H+ A) X8 F% h7 ?
    [此贴子已经被作者于2004-5-2 15:55:47编辑过]
    ' Z& E* M9 q4 m# g- j% r4 F

    该用户从未签到

    25
    发表于 2004-5-3 00:43:00 | 只看该作者
    太晚了,现在决定用二叉树(第一次用)来做了,明天要出去,估计明天晚上能搞定
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    26
    发表于 2004-5-3 09:04:00 | 只看该作者
    二叉树来组合字符串到是比较简便的,这样应该可以去掉很多重复

    该用户从未签到

    27
    发表于 2004-5-3 22:41:00 | 只看该作者

    * R; D+ G5 F* A7 u: N4 ?( A9 I) s7 f8 ^
    存在的问题:
    4 t1 y3 b) A- z5 d2 f加法和乘法交换律引起的重复
    4 W4 c( Y% C% {- A; X7 p3 |8 b: |1*2*3*4/ j. ^! o$ ], _# w
    2*4*1*3
    7 k; P& n6 B- `$ q: l等的重复问题/ Z' y* Z/ k) k) P
    原本输入的数存在重复导致的算式的重复6 n& e: a* d, ~9 W2 v# l0 F' G# \( g
    如:
    * e3 n5 x6 W4 E, i/ z: y: i3 s3 3 8 8 得 24点的
    0 S. M% X9 ~; V2 ?8/(3-(8/3)) 重复+ D' a. _, |5 j# T6 r
    5 S( H6 K& t7 a; w3 A% U
    括号问题* J9 A/ P" N5 [( d% d) Y

    9 h+ a! R  v( `4 J/ s! H  e6 X' Q' L) ^6 P4 {
    8 a* g# m: N. i1 K7 p
    [此贴子已经被作者于2004-5-3 23:06:15编辑过]
    ) E+ A* H/ }! {/ S

    该用户从未签到

    28
    发表于 2004-5-4 08:43:00 | 只看该作者
    * y& R/ Z# ~, S' @
    & d' S: X- v; r- i2 y, ~
    修正括号问题

    该用户从未签到

    29
    发表于 2004-5-7 13:45:00 | 只看该作者
    下面的代码保存为.htm的文件就可以了 ; C8 `/ S; j) |3 ]; m还是比较快的8 ~: a" u R4 Q; z) L3 V " S: E& x0 e+ T! T 2 R4 K$ s S0 F8 ] 1 L1 d* s6 q; X2 i% I& m6 b3 Z: x9 b4 L6 C * `3 W5 ?& V1 Y. r l4 i$ N# N ?/ I6 \( V6 B , z. N: T6 ~8 E& y1 I# D3 Y9 g: ~& R4 |

    ( J; C. @" E; v4 ^2 }6 w$ ]$ d
    & ^0 E( y$ f3 M0 E1 U K7 q
    5 d; S5 u2 F+ b: M; G; w% N) C
    9 l+ W. }9 i- b0 {$ H! z8 S

    ; @% C! n, H1 @( l 5 _! {0 L8 i+ V; F, Z, M6 X4 q2 H

    该用户从未签到

    30
    发表于 2004-5-7 13:48:00 | 只看该作者
    没有取出重复的方法真实不好意思

    该用户从未签到

    31
    发表于 2004-5-7 19:09:00 | 只看该作者
    晕,好多For ... Next,这样就是不太通用
    3 U4 Q+ V' X1 _* m- H  I' t, e8 B6 M9 P% F9 v
    要除去重复的,实在困难,我想是不是可以给一个算式一个特征码,以判别是否重复,可以这个特征码不好找啊

    该用户从未签到

    32
    发表于 2004-5-8 08:01:00 | 只看该作者
    现在是vb可,我准备修改原来的代码
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    33
    发表于 2004-5-8 09:49:00 | 只看该作者
    以下是引用唐明在2004-5-8 8:01:19的发言:7 |0 `  C5 V4 d( J* `
    现在是vb可,我准备修改原来的代码

    + h* a( y/ O: R- @但是你里面还有错误啊
    , y7 \; d& U# `比如 . q% }" N( Z- o. ?" M* `. x6 i
    5 5 11 7 你的程序竟然得不到算式啊,而我用我的那个跑了一下得到如下
    7 b" J) \7 b% ]+ O& W: F5*(7-11/5) = 24
    # g# V4 ?5 g# \# |2 N5*(7-(11/5)) = 247 }" _3 P+ m( Y: l& ]
    5*(7-11/5) = 24# T2 e% ]$ d/ B- |; y7 O6 e# I
    5*(7-(11/5)) = 24/ k. g  i) c5 g+ I8 x) K8 y4 d& m) U

    8 ]! E. _7 u/ w  s6 P8 Q: A5 s5 ]& LFor 好多,注释太少了,变量干什么的我都看不出来,所以你的程序那里出问题我也看不出来,那么多for差点看傻了,还不如低归舒服多了。 加油加油& X, ]% |3 P$ Q: k, ?0 R$ F& P
    % w9 C. s% `$ i5 S
    [此贴子已经被作者于2004-5-8 9:50:08编辑过]
    0 c$ h/ C( b2 W: v- g; k

    该用户从未签到

    34
    发表于 2004-5-8 10:43:00 | 只看该作者
    8 b1 W0 H8 D9 |9 z/ F# ~" n
    [此贴子已经被作者于2004-5-8 18:29:04编辑过]

    8 B% F# L' F: L9 n& J2 w

    该用户从未签到

    35
    发表于 2004-5-8 10:47:00 | 只看该作者
    这些是原始的版本代码没什么测试
    7 _6 O# z" P0 u这次5,5,11,7还是个问题
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    36
    发表于 2004-5-8 10:59:00 | 只看该作者
    以下是引用唐明在2004-5-8 10:47:10的发言:
    0 v. t% V# ^/ ]! r6 u8 l这些是原始的版本代码没什么测试
    4 F/ J  ~# X$ r 这次5,5,11,7还是个问题
    - e, x% @+ C. Y6 ^1 q
    我也是随便测试了一个,就碰上了
    4 e! m1 Y8 J6 U) [9 I应该还有很多类似情况了' O- y2 x! f2 E9 a, m& G# }. N

    该用户从未签到

    37
    发表于 2004-5-8 11:12:00 | 只看该作者
    请问如何实现4个数字的 所有排列方式. W+ m: _5 l5 X* N1 ~
    5,5,11,7的问题就在这里  @! x( W% m9 r7 G4 E8 w9 t# P$ G
    向5,5,7,11就有结果了5*(7-11/5)

    该用户从未签到

    38
    发表于 2004-5-8 13:28:00 | 只看该作者

    " v; O" U$ ?3 i0 ^: u6 K* a# i
    [此贴子已经被作者于2004-5-8 18:33:46编辑过]

    $ k/ I9 u& _( D) M
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    39
    发表于 2004-5-8 13:29:00 | 只看该作者
    如果是只有4个数字,那么一共也才4!=4*3*2*1=24种,那么你全部列出来就可以了啊。24钟不算多。

    该用户从未签到

    40
    发表于 2004-5-8 16:35:00 | 只看该作者

    几天前的东西,现在没有大兴趣了

    过重复代码过多,比如二叉树的建立等等 3 j. ^+ H5 t& y% B2 r3 t# H# M/ F+ {) {" G6 ]% l #include " \% n8 g% k) o. |#include 0 j a! w i: \- x; C( S0 w 7 `5 {9 d/ l: I9 ztypedef struct node # I n9 d( [$ J, l" g+ y{ 2 E1 J# c0 ?2 S) [/ M& A float Data;% g. u2 h$ H7 T8 q5 ]3 g/ J char Formula[100]; ' r" m) N3 r( X0 Z2 |4 a) W1 K int frist; //优先级/ |, Q7 b. |! g/ ^4 {3 o struct node *Lchild; 4 \2 ^9 B9 \% k1 Y% I+ t3 r struct node *Rchild; 3 S) M S* T' U} BinTree; ; z7 T7 @( t: j+ x5 S) A/ Wvoid CreatBinTree(BinTree *Tree,int *nArray);6 F5 _* u* K- g! ~ void FreeBinTree(BinTree *Tree); # g4 ^7 Z1 _6 u B$ \) r. Zvoid AfterBinTree(BinTree *Tree,void func(BinTree*));9 ~6 _! J( t4 b0 O" ?+ c: K float CalcBinTree(BinTree *Tree);: Q" \) G3 F; T0 A/ f! O- } float GetFormulaVal(int *Formula,int count); . ?1 X0 P0 G! z6 D0 y1 @void ShowFormula(int *Formula,int count); ! w0 i& g! x0 Z* o) x( t8 Q bvoid AfterNode(BinTree *Tree); # X0 M7 y6 R# x5 W& E, u1 nvoid GetFormula(BinTree *Tree); / h% S% p' m; f2 H' k: v% f! l6 i: kvoid Myitoa(BinTree *Tree);$ N5 S) V' l9 n9 C int EnumFormula(int *FormulaNum,int num,int sum); 1 C3 I/ d$ J2 W( y dvoid Restore(int *Formula,int *NumSym,int *temp,int count);) e ?: R# J; y/ J. q/ I int IsOK(int *Formula,int count); $ z( T ]1 C I6 C: Oint FindInt(int *nArray,int n,int len); * r' l% w3 i1 h* {' E3 Iint UpZero(int *nArray,int n); " f- V2 q1 z+ E) c- R9 X0 Gint IsDownNumSame(int *temp,int count,int num); ; R) o" W/ \# B1 t" q, r, M - m. Y* [9 P6 f9 ^9 B) X: h! _const char cSym[5][2] = {"","+","-","*","/"};1 v: t m+ R; S& G+ H7 H! I: G * l) v5 O0 Q1 M2 t, @8 U1 [ int main(int argc, char *argv[])5 e3 V3 W+ z* ?& k: b7 |2 N. {9 ? {* T7 ]- ~% }* R int i,n,*Array;# L/ Q& b+ i" W3 z% y7 i2 Y# c" C 2 t9 n2 F' y& W8 }# z/ ` //printf("几个数?");( s1 J \1 Y4 U3 S6 ]7 n( p# @8 M //scanf("%d",&n);$ `) @9 R; o$ E5 I4 E" m n =4; & Q* B, L0 y; @ Array = (int*)calloc(n,sizeof(int));, ?3 V- e2 A. N# w" q+ r$ S' O printf("请输入%d个数(用回车或者空格分开):",n);3 X# t3 ^3 T- p2 K for(i=0;i; Z( t; d" C5 R scanf("%d",&Array); 2 k# x1 c. X) y2 i( u printf("总计%d个式子\n",EnumFormula(Array,n,24)); & R4 @# }9 @: {* K) C( n free(Array); 0 [6 Y3 n: X3 K( u) g , Q0 f0 u2 S( M, G }0 |: [ system("PAUSE"); $ e. g, u; |3 e2 q# V% c7 n return 0; ] n; P8 g0 w3 | }+ a8 o( q( [9 i8 V Q. G8 ` 8 T# h1 Q! w: R$ |, wint EnumFormula(int *FormulaNum,int num,int sum) * Z `9 o0 e9 T4 S" d' t{ : J( U9 |( }1 a* P6 A int result = 0;( s7 d. \" M. ?& S$ f8 @ int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组( E$ ^: `" Z/ H! v7 V. j int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间+ R4 R7 Z' s8 d( \ int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间 $ Z. ^. U0 Z9 C int i,j; ; P* `- k* A" O1 l( v1 B for(i=0;i = FormulaNum; //载入进行穷举的操作数 % B7 W% c' u( i) X+ ~# M/ D for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号$ c$ m) F. ]8 M) C, s* ? 5 t. ^( v7 a: y+ a) u2 f1 [- K. } for(i=0;i = 0;8 {) z+ T% F" q. M; X: G K // 穷举开始,结束的标志为波兰表达式代号空间最后一位已进位,即前面各位已穷举完成8 _3 t" D" D0 Y( x- J& n. S; b while(temp[num*2-1] == 0) - ~9 N' f f' L4 Z/ [" x { / ~0 I! F- }% |" j& c+ C5 e if(!IsDownNumSame(temp,num*2-1,num)) * x/ c* o7 z2 a. W+ c { - @+ ^' E( q2 L" d Restore(Formula,NumSym,temp,num*2-1); //还原波兰表达式 # }2 H- x9 E% X5 X) E# D6 J if(IsOK(Formula,num*2-1))6 G9 `. v& u; x {: q8 m/ E* n. |+ d) G float t; //结果偏差 / X+ u3 P" [( ^- f7 ^ t= GetFormulaVal(Formula,num*2-1) -sum; [1 m) v2 D+ K/ {* N6 N2 x: P if(t>-0.01 && t <0.01) //结果为浮点数,只能进行近似比较3 X/ Z: v- d" k9 M- r { 4 ]# p; t, B8 S0 _0 v result++;! ?: S7 i2 V" b* R ShowFormula(Formula,num*2-1); % _; M; Y! G5 e) H }& r( F" E! s% R, i1 g: H! U, C } 7 }. E* \2 \* C } & H' b$ p( P- Z7 Y/ T0 l- v1 m temp[0]++; //穷举动力5 R+ E+ c \5 d% x. m$ } for(i=0;temp > num+3 && i//代码空间类进位 7 w! s$ U: F* e$ L' w { : C. O( x$ z$ D) M temp =0; 9 a* o6 v9 G4 f2 Z& l" i. \ temp[i+1]++;* O \ S7 i8 ?" L H } , O2 a, b9 }' @2 E7 K } 2 K, I9 }6 i2 S // 释放内存 ; B; R/ H% T) G4 Y3 q( s free(temp);+ q. E7 X# b, k. D : e% ]' t2 r, r+ Z# v2 u //free(Formula); //??此处不知为什么会出现错误8 }9 Q" c2 m) c, _9 B free(NumSym);3 ~/ k' t! ?# h+ K, S& C- ]! y7 u return result;. h6 R9 I$ L0 s% _1 H } 7 d0 s+ |) m3 b; Y// 由代码表还原为波兰表达式& A# B' S- ^) } void Restore(int *Formula,int *NumSym,int *temp,int count) & Y8 i, [( D/ n: w& I; l% @ h{ ' g* \7 u- w( a' Y% C0 p) x r int i;+ W( [' K/ K) Z) j for(i=0;i = NumSym[temp];' l' S- O& `" [* M- M }7 T: \% X: ~" h, G7 q // 判断是否符合波兰表达式 " z& @" F+ \! ], \/ Y0 o5 ~// 符合的条件是每个运算符号前必须是操作数个数多了运算符个数, P" S, M$ [2 k$ g$ M4 I3 f( f3 L# [ // 且运算符个数为总数减一的一半 9 z3 I& ^7 w1 d* u x, ]int IsOK(int *Formula,int count)5 ~/ J1 g- _5 M7 i7 B, h {6 ~2 A" z8 Q7 [: x9 \7 A int i,j; 2 W# Y1 i2 w5 c- Z: C4 H for(i=0,j=1;i- T% S$ u. z- ~, N) q5 M& e if(Formula<0)* U( J. y, `3 r if(UpZero(Formula,i)>j) j++; 4 |8 t: f9 l0 X6 c& O# } else break; 6 D6 z7 K/ i, P' S if(iint)count/2+1) return 0; $ S! e0 {* I' V; _ else return 1;! V9 a9 l3 F1 i- W0 i }; v% R" r" N# W3 y- m4 e // 查找数组大于0的个数 / H/ _8 G% T6 f( U3 p- Sint UpZero(int *nArray,int n)2 H' ]" c5 \0 B" H% ? H { 7 n. r. z, d6 O" u) q3 r int i,result=0; , }* |4 w3 N" X0 s for(i=0;iif(nArray>=0) result++; * o0 [* S0 I+ A& _6 m2 X! x8 F return result; 8 A' J3 b2 p2 T! E: u1 K8 y! q. A} - r- O. U) h2 D9 i8 u// 查找数组中,小于Num的数是否有重复 " X( J5 u( H! E+ a9 F; dint IsDownNumSame(int *temp,int count,int num) ; p0 I# d) A& e: L- B! ?9 a{ + ~! j" [+ n, E9 ?) J3 i) v" a int i;; i9 ~$ a! c, q1 `* O: F- e for(i=0;i1 {4 z6 a& p. \5 c; ^' R { 2 b8 e1 c+ u8 l if(temp < num)7 j& ]3 w+ e6 i if(FindInt(temp,temp,i) != 0) return 1;7 P& l+ l: J4 M. V* Y) m0 e } 4 V* ^+ n1 T/ [/ E) N$ r return 0;9 g- Q. r% B J5 n }/ H ?6 d; u7 X; i1 b$ i // 查找数所在数组的位置,返回0为未找到 # K1 _$ W4 ]' O/ a. o" Cint FindInt(int *nArray,int n,int len) ! T7 \* K i E& z6 l* L4 W7 F{ 3 X( e9 Z! Q! C3 i$ I# D int i;7 p. z+ Q. q+ T( x1 I; T. w- h for(i=0;nArray != n && i. \6 B" i. }0 z/ B: P7 k( \ if(i>=len) i=0;) l0 j* P" y( m% z" o4 t" h. Y0 c5 p else i++; ( H1 Q3 z; b3 p5 O* l return i;6 o, ~, D! e9 g, y, l6 s/ N }4 X% M& p, h; V$ i X4 V & R5 d9 H" v$ p0 F$ L1 H// 计算算式结果 ' { J& O, b* `' X+ }float GetFormulaVal(int *Formula,int count) + L; X: I! ^, D1 x3 B; y3 K{ 5 `* R0 |5 z: r+ j2 R float result;: H9 n6 B9 ~: E2 c6 s BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点 $ R& t; z, T( ^3 N( |: D5 C' k1 M int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度 * l6 [ B- U0 _$ H' s* C3 x, j8 d4 \ int i; # w" d: X# R5 H: [$ F7 t% a for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式 1 v6 W5 W6 w/ B4 n& C& I nArray[0] = count; * m" S6 [! h9 f7 s+ W x CreatBinTree(head,nArray); //建立二叉树 . m6 ]. ^- ?8 X, a! g0 i' N- \0 D result = CalcBinTree(head); //计算二叉树算式4 n* j# H3 Q/ }5 Z AfterBinTree(head,&FreeBinTree); //释放二叉树空间2 X) [& m% ~3 p, J a$ ` $ i& s8 c6 C; l* A+ _# a free(nArray);2 T& ^; v/ b( ~4 G( j return result;0 n0 ~0 m7 P$ }2 v) e: K+ h } " K. f- T1 i/ s4 ofloat CalcBinTree(BinTree *Tree) 9 x& O7 C, n2 o9 {4 H{8 f3 t; y S: m - g9 J8 O; M& V2 s6 E; x AfterBinTree(Tree,&AfterNode); q, P6 \ Z. ~" a return Tree->Data;3 t' D' \; i9 N& b9 | } $ `& [8 i X' r5 {/ q" V! m( v" v3 j# p _ // 后序遍历二叉树进行计算,但会破坏二叉树本身0 n$ y( D% v) ~. F6 F& P: _7 P // 一个结点的结果为左子树 (运算符) 右子树* M5 l. W# | S% `1 M- F3 h1 ] void AfterNode(BinTree *Tree) 5 }4 w( ^2 w" i- F$ B{ 0 v$ n# `. G3 P2 ~: k; V/ K: e switch((int)Tree->Data) 6 K* Z( \ q- ]( R) D9 b! K { 1 Z$ g, I" M/ v: } case -1: 6 b7 m; k" A* B/ B3 R5 B( A$ ^ Tree->Data = Tree->Lchild->Data + Tree->Rchild->Data;6 l/ v# k6 k; u break; 0 ?% U/ N% K, H8 P6 G$ q case -2:0 }9 A- C) r7 l) h Tree->Data = Tree->Lchild->Data - Tree->Rchild->Data;+ b$ A1 G4 H" P4 | break; ' o8 K5 O& S% t( c. L case -3: q. F2 I, V' X' j Tree->Data = Tree->Lchild->Data * Tree->Rchild->Data;3 A7 L/ v; ~5 t break;; O# T/ ?& ?* _! Z# m8 H% m/ {; R case -4: ( Y5 Y: r9 f3 ~8 C Tree->Data = Tree->Lchild->Data / Tree->Rchild->Data; 5 F& s0 h7 i- u: ]" g( U break;4 _4 h; v: w; h1 ~- ] }& Z2 @7 J V6 \2 s } & v1 r6 z1 i+ f4 j1 l1 | T// 打印算式, v) e) ~, Y$ F; G4 W+ C; ]1 x ! `5 Y& H: x' a4 r- ?void ShowFormula(int *Formula,int count) A- c8 m4 W* o, m6 c8 x8 T{9 g* i9 m) m+ `# }' d# u0 r BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点 % J$ B7 [; b$ w f; C* K: f3 c int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度3 ~ P$ G8 H- y! T7 X) h7 } int i; 1 N2 G* v w" n/ Z6 `/ Q- ^ for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式 _5 k+ O' r4 V3 _5 R, C+ p nArray[0] = count;! C9 s" Y5 r) A" L; b. i# I9 { CreatBinTree(head,nArray); ! p& h3 P! t& l; m# t0 m9 m AfterBinTree(head,&Myitoa); //初始化二叉树字符窜部分 - u3 n f7 l8 B h AfterBinTree(head,&GetFormula); //转化为普通表达式, L6 I; G$ `/ s, _3 c printf("%s\n",head->Formula); ! z( M r8 R8 T. f. ]0 ^0 M AfterBinTree(head,&FreeBinTree); //释放二叉树空间 ) u/ w3 N/ J% _6 [7 q5 G free(nArray); t2 z4 N4 I5 C& v# k; g , T5 f4 f1 h7 D5 z4 m } & ~$ `+ |5 w1 e. N9 o9 ~3 ?; E+ l// 类似计算二叉树 + d$ r6 V" T; L/ ]// 会破坏二叉树本身( Y/ Z. A; j$ Z+ V void GetFormula(BinTree *Tree)2 `, l6 Q8 m- R$ J [ {% v) k: C6 `% [. g0 j) U# | // printf(Tree->Formula); ( ], b8 f9 z3 v: O! h if(Tree->Data <0) 4 t M; l \, s, w {. O2 q1 ~9 E' { char temp[100];# t( K5 M3 Y* b- A if(Tree->Lchild->frist < Tree->frist) * O! m7 d8 {. d0 M1 F+ [$ r; D {0 Z% U) s! x9 w: }0 a5 h strcpy(temp,Tree->Lchild->Formula);/ W& z p/ d! k: B7 g strcpy(Tree->Lchild->Formula,"("); ' ]( ]) W; S2 y- x5 J- E strcat(Tree->Lchild->Formula,temp); / ?( z( G p9 }1 s2 j. e7 m! A3 a( h, l strcat(Tree->Lchild->Formula,")");' n# S9 F z4 T; \ } - d( W5 y) m9 T* X2 |6 D if(Tree->Rchild->frist < Tree->frist - N) |- W$ z" j$ P/ l || (int)Tree->Data == -2 && Tree->Rchild->frist == 0! `( B9 o4 S- {$ a || (int)Tree->Data == -4 && Tree->Rchild->frist != 2)- W n1 c0 G! U9 h) b { : D0 P' f, b- I: I9 G strcpy(temp,Tree->Rchild->Formula); 3 ?' ^1 R6 u* b7 e: l- K" G strcpy(Tree->Rchild->Formula,"("); - K! ~% {# q; d strcat(Tree->Rchild->Formula,temp); 1 }. v5 ^0 a4 b& } strcat(Tree->Rchild->Formula,")"); - f o3 c Q7 @ } 4 B( R2 Z! v) c# W strcpy(temp,Tree->Formula); ; ~4 s# U) \* l: J! x strcpy(Tree->Formula,Tree->Lchild->Formula);9 B5 M8 [6 U0 d, I& @& i strcat(Tree->Formula,cSym[-(int)Tree->Data]);0 f5 s) @! ^9 l0 L/ L strcat(Tree->Formula,Tree->Rchild->Formula);# \+ C9 E' v& b; m/ u5 b* W }9 h$ ~" [# @6 O" m }9 O' J/ [% |' {1 B& S // 对二叉树字符串部分赋值3 r7 S e2 \7 F5 Y0 a! i void Myitoa(BinTree *Tree) - t2 y) I h, z0 j C- M' F{6 _$ \2 B: ~% [% q$ s7 R7 S# l if(Tree->Data>=0) 2 ]' ^* K% G/ v, ~$ P( h$ o) M0 l/ A {% T6 ?) }! m) s- m( h0 x9 o) k itoa((int)Tree->Data,Tree->Formula,10); 3 n, f, P% G. G& A H, ]) ?/ q+ b; M Tree->frist = 2;' P$ }# u) z( ^% u2 Z }) i' o/ V, z) E) X) t else6 S8 N$ ~& t$ k; A9 n, f, a4 j { 3 q( A' q5 U, m7 l" j ]- v Tree->frist=Tree->Data < -2 ? 1:0;/ {! t* ~2 v5 g- c: H strcpy(Tree->Formula, cSym[-(int)Tree->Data]);0 j$ }, Y9 b$ X, R3 V //Tree->Formula[1] = 0;. `. z: W4 E; R5 i } : |8 u1 d& {4 {! Q# O; l# c* u}$ v. [# o6 {% ] //从一个波兰表达式建立一个二叉树链表,需指定一个头节点' C% d# x, C/ `4 l void CreatBinTree(BinTree *Tree,int *nArray) - ]$ R/ y' D0 D# B# {{ , l* n) F$ j1 ^: E& E' V/ D Tree->Data = nArray[nArray[0]--];- g! Z' O. S9 D$ ^! r if(Tree->Data < 0)* ^; g8 h* ~7 s$ J$ H {) |0 d# J w2 A: f Tree->Rchild = (BinTree*)malloc(sizeof(BinTree));8 R4 y5 o' D; ?% J8 p" G4 q CreatBinTree(Tree->Rchild,nArray);3 A* {) r4 O0 d Tree->Lchild = (BinTree*)malloc(sizeof(BinTree));5 k+ o( z6 f- v3 X$ p$ p& o7 D q CreatBinTree(Tree->Lchild,nArray);3 q% e( a2 W3 [( C }. L# E- ^3 _$ { else9 n" D" H. N" r ` { 1 y/ f9 ]* \2 Z- C% @3 | Tree->Lchild = 0;& ^" j! D* k( O: |0 G0 i/ S Tree->Rchild = 0;) L3 {2 `, e- M3 {0 h4 Q5 F7 o } 6 l, `8 k8 x3 s; x6 a& M6 }3 k& k8 p " N" `/ E& F5 \4 g4 x5 ~+ F}3 h1 S8 \5 B/ [/ a7 m 5 j9 c& R; `, Q// 释放二叉树空间 $ i% D! R3 c; B! gvoid FreeBinTree(BinTree *Tree) % c; J" a/ i; y+ O& \* z{ 3 k) B6 n3 { p6 q free(Tree);/ d2 x% O) G! F6 W9 q( a" A } : Y6 v& J/ G# ~; P3 V9 f// 后序遍历二叉树 9 `/ k! j& W, a8 }0 U// 方便其他函数调用,func为要对各个结点进行操作的函数指针" E; {8 {9 r, o void AfterBinTree(BinTree *Tree,void func(BinTree*)) , y; V g, _6 @* P( L; \{$ p! P: G9 p2 Z. Y4 C& @: Q9 t if(Tree)4 s! o# [& m0 ?" p4 ~$ X8 x {$ @7 ]( P) D+ c& \- Q' a# P AfterBinTree(Tree->Lchild,func);9 V P# Z8 l8 m AfterBinTree(Tree->Rchild,func); : I' V8 k4 ~" F& G func(Tree); 6 D. q6 n" [* c) ~) ?+ n3 e( \ }9 p) ^0 S8 s" O7 ~ } ) ^8 s5 |4 \" X. t, f% u

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表