下沙论坛

 找回密码
 注册论坛(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的发言:
    / V! p0 i( ]4 g5 d- I1 b7 W: y$ i! m* G" C
    2 m- g5 u2 @, h1 k
    用这个好了,只不过输入的时候要按从小到大
    ; Q" \) v* z2 t; ~8 P7 F7 G( i! o, Y( w! L7 C3 O5 P
    好象有BUG,我暂时不太清楚

    . x, c. y2 g" ^* C4 B 好象不行啊,我输入 1 2 3 8 结果是 0个算式
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    22
    发表于 2004-5-2 15:46:00 | 只看该作者
    这些重复都是可行的算法,我想了很久,没有办法删除了,8 Y, B* J0 q- ^2 v6 c. G
    比如 " J1 H& Q; n- N5 n/ n
    1*2*3*4 ' W# l1 P3 V& |
    2*1*3*48 q) j, w9 p! \0 c) o; B5 @6 M( u5 Q
    4*3*2*1
    ' k% M9 d  M5 @8 h2 ?3 Z4 U2 A这些都是我们看来是一样的表达算式而已,对程序来说却是完全不同的计算次序,所以还真的难以在算法中高效率的取舍,看来只有在得到所有结果以后在进行一个比较来取舍了。那是比较简单的,不过又多加了步骤,时间也就花得更多。$ w: D7 N" E7 [9 \& u$ b$ v
    不过如果游戏中不要求写出所有计算方法的话,那么可以在得到第一个算式的时候就停止
    1 E1 v' s2 W6 |
    ' ?+ M) E' G1 v
    ( D9 w4 r9 }# i& e5 P! q: _* H- i! G' H$ L6 Q

    1 x6 E) K; x3 M; D1 q6 q4 C8 R3 A, p, \3 ~
    [此贴子已经被作者于2004-5-2 15:46:49编辑过]
    3 n+ N. b, S. u' o" a1 g

    该用户从未签到

    23
    发表于 2004-5-2 15:50:00 | 只看该作者
    问题挺多了,我要再好好修改一下
    ; ]: B2 ^0 j: r! W# n9 G
    ' X8 n& l" ^" g我本来想用波兰表示法进行算术计算的,给搞错了,哈哈- N6 h' S8 O9 h2 O& v
    [此贴子已经被作者于2004-5-2 15:53:03编辑过]
    7 z  F. G4 T7 N* ^
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    24
    发表于 2004-5-2 15:53:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 15:50:48的发言:& f( h5 [' b3 |( `1 V* P
    问题挺多了,我要再好好修改一下: i- a) z4 g* a: I

    ! M+ y- p* Q% D. I2 o, H+ X" w 我本来想用波兰表示法进行算术计算的,给搞错了,哈哈# I& L! q6 R% k$ k' a

    + S" J* d! D3 B4 e2 s# N还写啊?这么有空,建议帮我把vb的改成c的吧,优化优化,那真的可以写个小游戏了哦  9 n7 X- S  p, ^5 |

    5 m' q4 y( l; x" a( l) ~
    & {8 f  N+ b. c7 {
    [此贴子已经被作者于2004-5-2 15:55:47编辑过]
      l2 l! m5 i* g

    该用户从未签到

    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 | 只看该作者

    ' x. U% e3 o! h: Y4 b
    . o; {" o" J! J存在的问题:
    7 L0 ]1 M7 {1 E" G加法和乘法交换律引起的重复
    + A/ m) F% @9 j: a' ~* M1*2*3*4
    7 b! a9 J1 ^$ ~4 S8 B! f) U) h  ]2*4*1*3
    % U0 F" Q" \8 Z$ k# d等的重复问题
    2 {- b" O$ T$ ]& i0 A) A原本输入的数存在重复导致的算式的重复; B5 ]; w' W5 R3 }0 m
    如:
    : M" g6 S8 k8 Z7 ~5 d3 3 8 8 得 24点的0 C" M' H" l3 `9 }0 P
    8/(3-(8/3)) 重复
    3 D& m4 H1 H  e' H
    1 X' e  T3 Q$ i6 }! z; o括号问题
    $ ~  ~( [6 ^9 ~/ B- T; n* K/ O+ H6 x0 K4 |) a1 n: a. Q: B
    " C% U; p; a$ X* G
    ' L/ a! D: \% U3 Y5 N* @" V
    [此贴子已经被作者于2004-5-3 23:06:15编辑过]
    1 C$ a0 W% f1 S/ ?4 j

    该用户从未签到

    28
    发表于 2004-5-4 08:43:00 | 只看该作者

    - O+ `5 m$ n8 p& D( m3 C9 y: y
    / ~* K/ F) d. P修正括号问题

    该用户从未签到

    29
    发表于 2004-5-7 13:45:00 | 只看该作者
    下面的代码保存为.htm的文件就可以了* _1 |$ V1 w0 M6 E( W6 _$ Y 还是比较快的 $ J& ^( g. J! O$ t$ Y. R ( t |- F+ t( Q; ^ 8 F% q5 o! }; i8 U3 m! a 5 g/ e' |- t+ E$ r8 G3 ~# J9 [7 w: C: z6 d. t4 i & o0 U/ U9 a1 @" v2 z8 `7 ? + p, L& h# |3 Z+ c) A: R; a4 i2 {. f 8 ^6 o- W: C- m9 w. e' w- K4 M# N( k

    ; v6 ?: A1 A) v# t; q
    ! v; D) y' p+ i# F% {
    : I. z/ H) T9 Y5 s$ |' T% G+ Z7 s
    ' F. L, C, w/ v* ^& X/ S. }

    ' k' ?& L' E$ u) X, p9 e% A# B/ k0 ^. l6 t b0 s$ F8 _

    该用户从未签到

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

    该用户从未签到

    31
    发表于 2004-5-7 19:09:00 | 只看该作者
    晕,好多For ... Next,这样就是不太通用- U4 }: c0 x. n% g2 i
    9 {1 b" _- F: J  S$ o1 K' C
    要除去重复的,实在困难,我想是不是可以给一个算式一个特征码,以判别是否重复,可以这个特征码不好找啊

    该用户从未签到

    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的发言:
    9 ~& `- @3 f+ x* M0 a, b9 O现在是vb可,我准备修改原来的代码
    / o# c$ P' m; K" {
    但是你里面还有错误啊: O4 X9 y0 A6 _/ Q$ f  H' L
    比如 ; S6 V  v( h, s9 m0 ], E+ r
    5 5 11 7 你的程序竟然得不到算式啊,而我用我的那个跑了一下得到如下
    " |% ~  A0 c* F# ~/ \: ^2 ~5*(7-11/5) = 24  z3 y2 y/ U& J- L; m
    5*(7-(11/5)) = 24' q2 J: x! R9 l0 K! i+ a  U
    5*(7-11/5) = 24& S% v$ w# m* ~- V
    5*(7-(11/5)) = 24( [% v: c4 B: f7 |) ?

    * Q* R0 t3 @3 f& w& U% MFor 好多,注释太少了,变量干什么的我都看不出来,所以你的程序那里出问题我也看不出来,那么多for差点看傻了,还不如低归舒服多了。 加油加油
    + S' S8 F9 M( o3 n% |, ^4 ~. T0 i3 F8 ~4 A8 ?/ Z
    [此贴子已经被作者于2004-5-8 9:50:08编辑过]

    / }8 y1 R: G; L. U' f2 h; P. T4 l

    该用户从未签到

    34
    发表于 2004-5-8 10:43:00 | 只看该作者

      U8 k) g9 E2 E
    [此贴子已经被作者于2004-5-8 18:29:04编辑过]
    # A2 H( F4 R* q/ F7 B6 o

    该用户从未签到

    35
    发表于 2004-5-8 10:47:00 | 只看该作者
    这些是原始的版本代码没什么测试  o1 O' Z* v8 _9 |/ G$ b
    这次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的发言:5 q# Q6 s/ v) Z/ y
    这些是原始的版本代码没什么测试/ S' [; _& D5 A$ [; z9 ^
    这次5,5,11,7还是个问题
    % d0 |( h  U( H% _
    我也是随便测试了一个,就碰上了1 }4 D. l+ a1 U. }5 P  D5 D+ l: i
    应该还有很多类似情况了% p/ S- l; j' X; U6 M; J

    该用户从未签到

    37
    发表于 2004-5-8 11:12:00 | 只看该作者
    请问如何实现4个数字的 所有排列方式! V2 K% B, E& p. W0 R# L8 |+ k' t
    5,5,11,7的问题就在这里
    $ i( w' z; e$ D0 z& `向5,5,7,11就有结果了5*(7-11/5)

    该用户从未签到

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

    1 x; ?+ E) v7 \1 ^3 O
    [此贴子已经被作者于2004-5-8 18:33:46编辑过]

    . s, K! y0 N5 n5 O8 r5 R- H8 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 | 只看该作者

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

    过重复代码过多,比如二叉树的建立等等 & o& e* Z2 b! a# a) z3 a/ Y 5 s j' N* A* O' r* A; T& i" b. o#include / f; P; \: |7 d- q#include 4 K& ]1 d7 g+ k' w: r / `4 _7 I' Q0 V, @typedef struct node / R( n! |& N) z8 K9 t{% [( K6 m# }5 [ float Data; & ^: R% t( [4 M: Q! ^ char Formula[100];9 b1 n' m* V2 B8 j4 Q x* V7 ^7 D int frist; //优先级 ]) V' e6 i2 P- w) H, @ struct node *Lchild; # K3 M/ p- j; s1 B7 T" G" G struct node *Rchild; # K" j' a. B9 V3 N% r5 O1 K9 o( X} BinTree;$ ^) z# a9 V* o# G5 P/ Y void CreatBinTree(BinTree *Tree,int *nArray); 6 l, F; _3 }- r; x9 {" [void FreeBinTree(BinTree *Tree);: k9 m: n( b: N4 u* i void AfterBinTree(BinTree *Tree,void func(BinTree*)); 3 v4 f* ^+ u& H; o/ Q3 h7 Rfloat CalcBinTree(BinTree *Tree);) n6 g2 _ I: G% p% |& o float GetFormulaVal(int *Formula,int count); 2 q$ \, I- J4 G% e Q" O; bvoid ShowFormula(int *Formula,int count); 3 h2 X F9 |- q Nvoid AfterNode(BinTree *Tree);' ?4 g+ o/ y/ h# J0 i# f void GetFormula(BinTree *Tree); , ]! @$ v S ]* Evoid Myitoa(BinTree *Tree); 8 Y# ~" g) o& m( P3 a, U% C% I0 s& |int EnumFormula(int *FormulaNum,int num,int sum); / O0 J- s5 o* p3 e' H6 dvoid Restore(int *Formula,int *NumSym,int *temp,int count);5 `7 ?9 d; a9 q int IsOK(int *Formula,int count); 6 u+ n: Z; @' Kint FindInt(int *nArray,int n,int len);. J! ^3 z7 ]2 t# |7 G" E: { int UpZero(int *nArray,int n); ! B7 M8 H! @7 Jint IsDownNumSame(int *temp,int count,int num); ( I, e3 ?2 k7 k! V% R5 s% z/ b4 J" d6 z8 g const char cSym[5][2] = {"","+","-","*","/"};+ z. c" A, V9 _$ }, F/ V " e S! p/ S4 W' q b/ oint main(int argc, char *argv[]) / P$ Z. Y; b9 {7 i{ ( D- m4 l4 \- E8 |- _# Q: U, T5 v int i,n,*Array;) l/ I/ R3 @6 m8 d/ ~! K / H8 ?3 x/ X# q+ M, n% i/ y //printf("几个数?"); 7 [6 ^" A' \) Z) Z //scanf("%d",&n);8 s! W8 q9 s. H0 h n =4; ( ]! V: X7 _, j% B! I- `# g Array = (int*)calloc(n,sizeof(int));9 g$ p6 d* l; t$ t1 L1 v printf("请输入%d个数(用回车或者空格分开):",n);! o+ @$ d. O c5 ^; |9 C for(i=0;i2 s3 L, z s5 @$ q1 R R7 Z scanf("%d",&Array);& w" ^0 i P( j' a) w* r# u" ^ printf("总计%d个式子\n",EnumFormula(Array,n,24)); 8 i& r: B$ Q/ S2 `& K1 [ free(Array);2 c% w; E* F8 }$ k: t , e+ h4 l1 t' N% I" G9 ` system("PAUSE");2 \+ K: j5 n! [9 v0 a" Y- ]# a( ? return 0; ! Y5 \ ~" J9 h}, F# Y% }2 A! o 2 o: k u+ o$ D4 _) c! G2 yint EnumFormula(int *FormulaNum,int num,int sum) 8 r i+ \; C! k" i5 {6 W{: `1 A8 i1 K! [+ w' M2 d int result = 0;$ Z) `7 K# ~. G; c. C+ g int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组 + t+ L8 o* v9 @3 h6 s& I% k8 j+ g2 b- e p int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间( B1 o* b6 T/ L2 }2 a, V int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间( E9 c; N O$ Y- U* ?) g int i,j;& K$ b% Q3 [3 v6 i$ X for(i=0;i = FormulaNum; //载入进行穷举的操作数 . l9 t4 G( w. F4 I for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号 4 G" ?: N% r- z! O7 M% b y) B# S2 K# S. \) k# y0 U3 _+ ?' I& t4 t for(i=0;i = 0;& p( m4 z0 P' i // 穷举开始,结束的标志为波兰表达式代号空间最后一位已进位,即前面各位已穷举完成 + k9 D1 i6 h9 i S9 Z$ O. v while(temp[num*2-1] == 0)1 _2 p, B* @8 ~! }: H {7 T" j; V3 \+ l) q if(!IsDownNumSame(temp,num*2-1,num)) + [' `* j) Q; ~- |' G { : b7 w! [ N; L Restore(Formula,NumSym,temp,num*2-1); //还原波兰表达式6 C( x0 N+ F- y0 k if(IsOK(Formula,num*2-1)) 7 k$ b3 [8 O D { ]0 G: z. e$ J& P7 b2 | S float t; //结果偏差 / o0 Z& W! d8 E t= GetFormulaVal(Formula,num*2-1) -sum; ; p& _2 T1 a" X3 C# `2 N) q& S8 W if(t>-0.01 && t <0.01) //结果为浮点数,只能进行近似比较' p, r' ~/ A; T/ i2 k- S { A; a: t+ T9 N( }3 {" s result++;4 C8 S& [$ ^( B4 S ShowFormula(Formula,num*2-1);& z; a6 `* ~' |. `( c2 Y3 _ } 4 P2 P7 V* E7 w3 R+ b- e8 A }( \* [% ]% [# o) v* d5 @8 x: Y }2 s7 O" y0 g' }; E" \ temp[0]++; //穷举动力 6 l; E% m2 \, R/ p( n- o- H for(i=0;temp > num+3 && i//代码空间类进位 + [+ w$ r# _( f; M { ' v& d" w5 r8 I0 }- w temp =0; 9 |4 J) w3 g" K5 s temp[i+1]++;9 A* S7 t9 N0 D- P# { }0 \, ]9 O& [( M }/ h7 S x( w0 _: g // 释放内存9 g) a, B5 u) @0 B) M free(temp); 9 L+ }2 U+ w! ?8 H' x; \* t ( G; {# I( ]5 _% ` //free(Formula); //??此处不知为什么会出现错误8 D% O5 N# f, T& O0 d free(NumSym); 7 y9 s) F) l$ K return result;# Y) q& r' _' q2 U8 u }! E+ X6 \: S0 P: N1 K1 K // 由代码表还原为波兰表达式/ g {# s( c3 m9 p. e) l void Restore(int *Formula,int *NumSym,int *temp,int count) # ]$ D1 g* I# j{ - `. @7 l% T1 ~. j- t, N0 b( o4 T int i; / R% H2 z/ B* I' Y2 T4 m5 F for(i=0;i = NumSym[temp]; , {; V; O; w( N: _}& D, Y4 \ n- U: `2 n. A) h // 判断是否符合波兰表达式! J$ F" k( ~$ z r- G // 符合的条件是每个运算符号前必须是操作数个数多了运算符个数& O& F% I, H! F! q P/ T // 且运算符个数为总数减一的一半. V+ q0 Q: ^! @! y' l int IsOK(int *Formula,int count)8 j% T" F6 q& C { ; X; w1 ?1 {% L3 o. i, u int i,j; 4 y- z8 X( }) O0 g' }' t" D8 [ for(i=0,j=1;i& n- \: c+ i* `4 O! _ if(Formula<0)0 c# {, X, v. T8 m3 Q' V, v+ P if(UpZero(Formula,i)>j) j++;4 ~' @3 ~! |) _8 k5 V1 g9 g8 @ else break; 3 `7 j5 Z% C. g. u$ V) o if(iint)count/2+1) return 0; 3 w* n5 x. v5 C3 U. {. w else return 1; 1 ?$ n4 v Z, R8 q" H, r# u} + X- P _2 C) x s0 h) r+ {6 v// 查找数组大于0的个数 c+ Z' a+ ], G2 W1 h3 Z' H/ f* hint UpZero(int *nArray,int n) , | M# b, {. \& y( c{ 5 T p5 }0 H9 M" z( j$ i4 ?" p int i,result=0; ; }, \4 r% Q; q! G( r" I3 a% {+ T for(i=0;iif(nArray>=0) result++;* l; s$ s3 ?' |( I- N return result;& L% q/ \% N; C4 s% f }( }, {' f8 c! D |* o1 P+ e% w // 查找数组中,小于Num的数是否有重复' g6 i/ X( _! N( o# z int IsDownNumSame(int *temp,int count,int num)4 V7 p! S4 O; A+ k6 @+ A) L, @! w+ P { / ]$ }/ \) V' o) c, B T int i;4 Z8 N* a6 A; M for(i=0;i/ f( M. g4 h* b+ m8 u8 [% C { 8 z; L7 m- P! v" e; i if(temp < num)& s9 T1 Y! B/ U' g6 a" E if(FindInt(temp,temp,i) != 0) return 1;3 R U; }: Q1 `5 D: v }" F- o$ P; Q. C' F, {2 W! ?1 r2 q return 0;% |% d' W$ _) d8 ^1 |% ` } - E8 p9 D) }- H// 查找数所在数组的位置,返回0为未找到; S1 \& ]# T8 A I* }6 j+ ]6 B int FindInt(int *nArray,int n,int len) 5 @6 J# A2 T1 M2 p+ p{ / D" t0 ^6 j- m; e int i; 6 K" u+ l9 Q5 o& r2 k1 A for(i=0;nArray != n && i- F+ n( G! y! }# |$ M if(i>=len) i=0;* L+ E6 ^. b2 o. p& w& ]5 A1 ? else i++;7 E8 i4 }7 t5 B return i; . D4 l5 m- e' Z/ r% M} 9 G. y; b& v- n7 ]6 H1 |5 f 5 a* q k* {( |3 q// 计算算式结果( }/ D* ]& z2 `) Q- ?2 ]6 B float GetFormulaVal(int *Formula,int count)% [ a/ D2 Z: E/ d& W3 r { - E4 s, k; j1 S# e float result;& v" e4 M c$ I$ q; H, K/ y BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点 : b% q3 n2 [1 J% Z, f6 M$ ~( \ int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度, V1 p8 K9 D' Q4 H# c / Q: J9 J5 h, L7 {2 e- M int i; ' M4 p: a6 k7 B' g5 U for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式4 {7 U! q6 D8 \' u+ }! B nArray[0] = count;- f% X V8 m' g1 N CreatBinTree(head,nArray); //建立二叉树1 O6 l* d; b1 B8 w2 I1 O+ T % s" s/ s/ E& }/ j# z6 O: J result = CalcBinTree(head); //计算二叉树算式 % R1 `, }3 v( ]; G AfterBinTree(head,&FreeBinTree); //释放二叉树空间 : }; r; v8 D1 g8 m$ \% i + m `& P6 [% d" a3 W( Z! N free(nArray);) ]* M8 A: I3 k% ?& C return result; : T% m3 v+ c& Z& K4 N} 9 M: Q: _8 i% O3 r% _float CalcBinTree(BinTree *Tree)* i# v. c3 P" g9 T% @& W( U$ ? { $ a9 q( c) `# s. J ' P. `2 a' ?" V4 M* r. V AfterBinTree(Tree,&AfterNode);/ v+ v' ? `7 Y1 J2 ]6 y return Tree->Data;! I, f# Y1 M7 k" L7 j* W# L }: b5 e$ T, p: O% k, l8 L - O6 \ z0 L i( [8 a// 后序遍历二叉树进行计算,但会破坏二叉树本身 * `3 h6 t- m0 F- K// 一个结点的结果为左子树 (运算符) 右子树5 y7 a8 z! L9 O void AfterNode(BinTree *Tree) ; G1 u6 v2 k6 }: m1 G{ ( `0 d2 {3 H, E* k switch((int)Tree->Data)1 d ]7 F/ h" ?. W {: h. V v7 P$ `6 S case -1:6 J/ t2 R3 u8 E9 S Tree->Data = Tree->Lchild->Data + Tree->Rchild->Data; . {7 \" G" ], k% k7 P break; ; }! G& @, S3 Z4 G. _ case -2: ( O- S3 r# D, R# o/ T Tree->Data = Tree->Lchild->Data - Tree->Rchild->Data; $ X8 e' J9 L+ d break; + \6 t" D+ m$ l% I2 p4 x4 i& e case -3: 5 c* F, z, m9 k Tree->Data = Tree->Lchild->Data * Tree->Rchild->Data;! b+ R) v! X ^' I0 R4 `4 w break; , b& o2 j4 a2 L! ~8 P- v L case -4: 0 q/ _2 r# @6 ^ P M' B9 @! ? Tree->Data = Tree->Lchild->Data / Tree->Rchild->Data;8 u' M& g2 L, l" s break; + S) S7 \% k; m7 I }" L1 ]- A9 Q/ h+ M, P } - s; d; I" T& A K: N// 打印算式 7 f/ F F7 s7 {: W7 C6 o ! S7 Y$ H1 Z" B& O% M: [4 b, tvoid ShowFormula(int *Formula,int count)0 g3 b2 {: X" c( D. Y1 K {/ h7 H/ [8 n3 r BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点' D5 R, B8 C9 } A& c% l int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度 V. O: d& ^# e* j, g int i; : p7 d, d$ F1 U( |% q for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式; S/ k5 ?; l v6 ?2 {, m nArray[0] = count;1 |0 ` |! u# _( ~* N- F5 m9 k CreatBinTree(head,nArray); : H* z9 Y/ T- ?( Z" W1 |% c AfterBinTree(head,&Myitoa); //初始化二叉树字符窜部分 ' X/ E! N" W5 h: M" E, b5 ~ AfterBinTree(head,&GetFormula); //转化为普通表达式 . S9 q, A+ b! X. L' k, V g& n7 Y; P8 Y printf("%s\n",head->Formula);$ n9 V, P# ?- A8 O# @ AfterBinTree(head,&FreeBinTree); //释放二叉树空间$ _0 T5 O8 j9 u' r9 m2 I5 n! E. k free(nArray);4 Q+ w) s4 ?/ T8 T- o# W) C( h : b! Z5 ^; w8 C' O# w) e {} 2 n7 M" `3 D6 D; c; d( {1 f% s3 s5 s* j// 类似计算二叉树 `& G- G Y1 N! V; P% A // 会破坏二叉树本身 ( C* y& _5 n$ c/ b" c$ Rvoid GetFormula(BinTree *Tree)2 I% y8 q. t0 O: u0 _7 Y u {# J, @. Y' V6 X1 m S // printf(Tree->Formula);! z2 N. N4 C' [% m, y( m4 K! m if(Tree->Data <0)$ s5 W/ e! w% e& ~+ E { 5 Z( z$ P8 A, C: z# m0 D char temp[100];# ]$ x2 N! T' ?% _" S if(Tree->Lchild->frist < Tree->frist)- P/ w7 K3 f3 c6 A9 H {0 t+ n4 q1 \/ m. S$ c strcpy(temp,Tree->Lchild->Formula);/ m+ V! @) F" J, ^ strcpy(Tree->Lchild->Formula,"(");; J y) j. Z" y. K; H4 ?6 g7 ~ strcat(Tree->Lchild->Formula,temp); / ]# ~! g8 z$ g, ? strcat(Tree->Lchild->Formula,")"); " D3 U8 {% [" K; X } 3 y, y9 b/ G% S$ H if(Tree->Rchild->frist < Tree->frist 9 o: P' h8 I& N; h5 {! T9 b# K || (int)Tree->Data == -2 && Tree->Rchild->frist == 05 Z9 k, v: d$ f- E7 } || (int)Tree->Data == -4 && Tree->Rchild->frist != 2) 7 o& I+ I4 b0 t) u6 d { " [2 U& o- g2 P( C( t6 {. b2 G strcpy(temp,Tree->Rchild->Formula); 5 Y9 e: o3 J& f9 G6 _# Q/ g0 i strcpy(Tree->Rchild->Formula,"("); 9 F" O6 O$ s$ O/ q4 g) P strcat(Tree->Rchild->Formula,temp);0 S1 u: T T$ [# \+ P% ]7 s strcat(Tree->Rchild->Formula,")");6 u5 z: q0 P! \9 m, P7 g } 3 z8 N7 z+ M" K2 q+ e strcpy(temp,Tree->Formula);6 y* c4 P$ S# m( ]4 U6 }$ D strcpy(Tree->Formula,Tree->Lchild->Formula);) u! [7 K: y ]. `8 `( N. Q strcat(Tree->Formula,cSym[-(int)Tree->Data]); 2 E5 z, n5 l8 X4 ^* w3 z strcat(Tree->Formula,Tree->Rchild->Formula);. H! J, D2 c9 j" ?; @/ ]$ r( `* y* R } 4 G. Q' A# s a' K4 F4 { }- M) N% [* _}6 x) |- }, H$ I; t- H9 l' d // 对二叉树字符串部分赋值" X$ s% E7 X3 I |& J void Myitoa(BinTree *Tree) / o% {" O. S& F- m" h9 B- v' T{2 W: d; \' ?4 R" F0 e. k if(Tree->Data>=0) . U* T" F, t s* G9 y5 P! Z( H2 \ { % N7 D) f) k" a) M; ] itoa((int)Tree->Data,Tree->Formula,10);, }7 J3 D, {* t# G3 e5 F1 H( I Tree->frist = 2;# l7 w- l {/ {6 q$ j7 L: `0 R } 3 n5 Y9 H R$ l# ^$ ` b5 d else 0 O3 C: g& z3 B: _9 G! I. b {3 f. ~% s) p& k" ?$ c; P- ] Tree->frist=Tree->Data < -2 ? 1:0; % }$ R* J+ t2 K0 g$ v1 M2 S" U strcpy(Tree->Formula, cSym[-(int)Tree->Data]);8 @! H1 Y- p4 g! a, n0 m0 C, k //Tree->Formula[1] = 0; O( ~1 q. Q# M! y# V }# g, W) h* l4 c/ v. o! N- J4 R } 0 C" |# U' |; T# T" `+ g( l% c! H//从一个波兰表达式建立一个二叉树链表,需指定一个头节点 " J: ?6 l7 l' ?: l1 l( avoid CreatBinTree(BinTree *Tree,int *nArray) ( r" P. f$ `2 q" ~) G2 J{. G4 h2 @' J9 V+ p6 V+ c Tree->Data = nArray[nArray[0]--]; 3 ^* V" V5 c+ g) ?/ a7 C if(Tree->Data < 0)& M+ W! k1 S3 H8 Q4 P8 z {/ X8 K# o& C$ A0 L7 L Tree->Rchild = (BinTree*)malloc(sizeof(BinTree)); p* T5 I% b, s3 P) s* U CreatBinTree(Tree->Rchild,nArray); * f% d( M% v* d3 V Tree->Lchild = (BinTree*)malloc(sizeof(BinTree)); 3 S6 S- V1 K# j1 q. | CreatBinTree(Tree->Lchild,nArray); ( M( z9 K* p6 G5 ~2 T; V }# Z5 J; I6 {7 ^- J else8 h" I7 i) V2 B0 r4 [ {5 x: ?* @7 U1 P& x* k1 q Tree->Lchild = 0; y9 }# e6 D( D; y- d+ F Tree->Rchild = 0;* N5 \3 O6 Z8 p2 b# ] }0 ?& E& v3 ]! ^' z% ~' K ) X$ e, S, ^9 y4 d. `} * Y" f$ A7 W7 `3 V * X! t) @6 D8 Q" P- [// 释放二叉树空间 ; g8 n k( O4 A7 ivoid FreeBinTree(BinTree *Tree) 7 }/ s* \% [1 r. ^2 A& @% j* B{ + t+ E" x* S. L c& X free(Tree); : h, e! v+ A4 ]. C' t+ ~} ; E, v; w, m) p6 R6 }0 e$ m// 后序遍历二叉树 ( V& N: }! Z6 m3 O9 l// 方便其他函数调用,func为要对各个结点进行操作的函数指针 / P9 _1 R7 P( z1 ]$ R4 Evoid AfterBinTree(BinTree *Tree,void func(BinTree*)) 5 r& i0 }. K/ H, _{! P0 p4 a0 U: e9 T" M/ X if(Tree)/ V; O$ ^& h+ P4 B6 M: C { A. \! K3 Y) g8 m& p4 g+ w AfterBinTree(Tree->Lchild,func);) x" u0 A F0 x8 U) D1 j AfterBinTree(Tree->Rchild,func);. g. k% m6 u# W( o, _5 E func(Tree); ) @2 w% c2 A* W2 n+ M, C7 u } 6 t. B8 w$ F, Q, |; x( @, j} 3 l1 m8 K# A: `2 A# e

    本版积分规则

    关闭

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

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