下沙论坛

 找回密码
 注册论坛(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的发言:
    ) z9 B% s/ o' G5 D( l, `3 f5 n! s7 P& Z
    + J& T! I2 b0 x6 C4 w
    用这个好了,只不过输入的时候要按从小到大& u8 d: b- R& [' o

    7 k+ L2 l5 }# v. ^; _+ p, L 好象有BUG,我暂时不太清楚

    7 D4 D: @+ W) H/ ?/ N' _ 好象不行啊,我输入 1 2 3 8 结果是 0个算式
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    22
    发表于 2004-5-2 15:46:00 | 只看该作者
    这些重复都是可行的算法,我想了很久,没有办法删除了,
    4 q/ C1 x/ J( Z0 [. A0 q$ p比如
    " g' Z+ L: |$ Q# d0 |1*2*3*4 1 W9 O0 t- u1 ]6 @, |% q1 [
    2*1*3*4
    - U1 o( Z7 C: H- p" I4*3*2*1" I2 H0 H8 a/ J  F8 p$ A+ v9 a
    这些都是我们看来是一样的表达算式而已,对程序来说却是完全不同的计算次序,所以还真的难以在算法中高效率的取舍,看来只有在得到所有结果以后在进行一个比较来取舍了。那是比较简单的,不过又多加了步骤,时间也就花得更多。( G! N1 S' j$ V- l- z- O$ F
    不过如果游戏中不要求写出所有计算方法的话,那么可以在得到第一个算式的时候就停止
    ) w) N8 q: a9 \# e5 R, |; r
    / G  ]' l! C' f# Z8 i0 p
      ?) {9 }- [+ u9 l# ^) q6 ~, ?/ B8 O0 x$ n! {+ {

    3 \3 T" C% n& {  p1 y8 i- J
    [此贴子已经被作者于2004-5-2 15:46:49编辑过]

    . y( {3 L0 c( X3 B

    该用户从未签到

    23
    发表于 2004-5-2 15:50:00 | 只看该作者
    问题挺多了,我要再好好修改一下1 e4 s! `' J, V' Q

    - c! U* W0 Y3 E我本来想用波兰表示法进行算术计算的,给搞错了,哈哈7 ~2 R. @/ Y3 c! V- b' r  d  Y7 t/ c
    [此贴子已经被作者于2004-5-2 15:53:03编辑过]
    % m0 B! f6 q0 a/ ]% X# M
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    24
    发表于 2004-5-2 15:53:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 15:50:48的发言:- a! z+ m, K0 P4 A; P7 m
    问题挺多了,我要再好好修改一下+ }$ ]$ p2 O+ G5 b1 ?2 [% p# g
    2 k" Z0 _* @/ ]1 U) u, H8 f9 v
    我本来想用波兰表示法进行算术计算的,给搞错了,哈哈
    * w- D0 o; ~) ?7 a
    + U% D" ]5 {2 y/ R$ N
    还写啊?这么有空,建议帮我把vb的改成c的吧,优化优化,那真的可以写个小游戏了哦  # v, f, I6 u" I) Q

    6 j' `0 z5 d  w
    ! K+ C% o2 L" M
    [此贴子已经被作者于2004-5-2 15:55:47编辑过]
    7 l  j4 u9 Z4 G9 _3 R: \

    该用户从未签到

    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 | 只看该作者
    / Z; _4 d- J% F! i6 X6 Z+ h

    , ]# x% h  K% K3 ~+ g( d存在的问题:
    " }+ G6 t; F# [0 y6 p$ H# h0 l加法和乘法交换律引起的重复5 ^: ?( G/ h7 a" `9 n/ Y' n( _
    1*2*3*4+ z3 ]: W+ y! J) W8 s
    2*4*1*3' n6 I# ^! i2 O' G. m
    等的重复问题# s, U# s+ c' K/ h) L
    原本输入的数存在重复导致的算式的重复6 d' b! p! ]+ y5 I
    如:& ]- L& y) ]) f* E+ b$ k' h
    3 3 8 8 得 24点的8 j! [9 A, ?/ b3 q: I7 \
    8/(3-(8/3)) 重复
    3 W$ ^* z$ @5 h+ @( Y* F) u" N' @
    % y9 u$ p2 k3 E" d# W括号问题, f5 k; p. y; L9 G
    4 S% `& ^7 S- k- R! `7 S
    : I" J8 F9 {0 ^* h
    : k# y6 i* }2 n# _  p
    [此贴子已经被作者于2004-5-3 23:06:15编辑过]

    % e0 m' C9 E1 k. W2 p

    该用户从未签到

    28
    发表于 2004-5-4 08:43:00 | 只看该作者
    2 ^( _' n' @1 p9 }

    % k7 X0 }- ]: M2 V# R/ g, s. ]& R修正括号问题

    该用户从未签到

    29
    发表于 2004-5-7 13:45:00 | 只看该作者
    下面的代码保存为.htm的文件就可以了2 b3 E5 ]2 ?% } 还是比较快的9 K, O C, D+ V3 J 4 B8 I E( t$ q& f! B/ q( K& K 5 L; @+ v( C3 h/ n8 Q; K# M$ Y, ] ! \7 r$ d6 b& e( v7 C + E9 M5 w$ {! {7 C6 F+ Y" N9 T! V! `2 `; u $ k0 A) v7 g1 M$ J0 z6 D7 O 6 Q! Q, S1 Y, i( S

    7 p' V' k; b2 Y- q4 ?# N3 m H) }
    : o+ y |8 x3 ?+ p5 |6 R! a$ i: v& w
    5 R n; f8 q, B( n" q$ }" M. O0 d
    0 E2 K* ~7 y! Z* O% ~/ U. f8 r. S

    ) ` r% S1 w, s' L ( a+ U$ n+ T1 t( B

    该用户从未签到

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

    该用户从未签到

    31
    发表于 2004-5-7 19:09:00 | 只看该作者
    晕,好多For ... Next,这样就是不太通用5 z0 h" s; h% l# H+ m
    " X* ~8 G8 I% K0 G# Z9 e8 B0 \
    要除去重复的,实在困难,我想是不是可以给一个算式一个特征码,以判别是否重复,可以这个特征码不好找啊

    该用户从未签到

    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的发言:, V/ D, C2 r! ~7 a2 k( Z1 n" e7 q; d
    现在是vb可,我准备修改原来的代码

    7 i& H6 m* J+ o  n; i  h  l1 Q! p但是你里面还有错误啊' J: I7 o, Z/ C1 x/ n! N
    比如
    / }) s' L7 S7 V1 x: T5 5 11 7 你的程序竟然得不到算式啊,而我用我的那个跑了一下得到如下
    3 \: P* h1 a' \4 b5*(7-11/5) = 24# z! e+ Q& z! T9 s) y
    5*(7-(11/5)) = 24
    ; c3 G) q2 v" A# k8 O1 N5*(7-11/5) = 24( X! F# e" r& L; u
    5*(7-(11/5)) = 24$ k6 n) E# d- o2 z( e  P

    5 Y0 X$ O& r3 [% V0 R, D( s2 `For 好多,注释太少了,变量干什么的我都看不出来,所以你的程序那里出问题我也看不出来,那么多for差点看傻了,还不如低归舒服多了。 加油加油: J# b/ K. r+ K

    9 B$ S% O- M* e; c9 Q. v8 ?* m
    [此贴子已经被作者于2004-5-8 9:50:08编辑过]
    : ?; C% P% x. e  y; f

    该用户从未签到

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

    ( J( v: {! m% y, X- E: o
    [此贴子已经被作者于2004-5-8 18:29:04编辑过]

    # N0 X. G- T/ m& a1 }

    该用户从未签到

    35
    发表于 2004-5-8 10:47:00 | 只看该作者
    这些是原始的版本代码没什么测试
    ) n% s$ ~; ~; h这次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的发言:
    " V( q' R7 n, h+ }这些是原始的版本代码没什么测试
    8 [4 H5 }; s. g9 ` 这次5,5,11,7还是个问题

    : F$ L0 p" z5 V' z% \8 ?我也是随便测试了一个,就碰上了
    ! w6 M% ~" F( F& F# @7 ~( L" U应该还有很多类似情况了3 A4 {7 J% s9 r. k3 L9 |

    该用户从未签到

    37
    发表于 2004-5-8 11:12:00 | 只看该作者
    请问如何实现4个数字的 所有排列方式
    ) [3 X, Y; x' `, j( k5,5,11,7的问题就在这里+ N+ X* n. y' }" n0 a, Z- H
    向5,5,7,11就有结果了5*(7-11/5)

    该用户从未签到

    38
    发表于 2004-5-8 13:28:00 | 只看该作者
    4 ]- u) [9 C5 Z& x# K
    [此贴子已经被作者于2004-5-8 18:33:46编辑过]

    # L0 K9 C2 T$ X; k
  • 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 | 只看该作者

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

    过重复代码过多,比如二叉树的建立等等* I8 L0 O8 F; V9 ^$ {& {" Q! V @3 j$ W0 q6 V1 A( b3 g- U #include # v- x9 s3 ?% ?#include ) i- q1 C# \) a% I$ ~! r ' T5 C# y5 D" P3 E; G$ Y5 [- P6 Vtypedef struct node 9 q( p( _% C$ m, h{ ( c9 Q# G( D8 `" d1 t float Data; 5 S2 T* E) h! u: |5 Q; ] char Formula[100]; : O* H$ P' O; m2 ?4 ^ int frist; //优先级 + \. ]2 B; T( w+ F$ U/ T5 P struct node *Lchild; / `& s, C2 b4 e1 T1 L, q( {: F struct node *Rchild; 1 q1 v/ U3 r7 U6 B) M" |" k} BinTree; 0 G: T2 m: `3 b, O4 I% ?5 G3 Ovoid CreatBinTree(BinTree *Tree,int *nArray); " w+ }. e" a0 D; Z$ T9 `void FreeBinTree(BinTree *Tree);3 a7 m5 k9 f- |2 u# i: T void AfterBinTree(BinTree *Tree,void func(BinTree*)); 1 y: E0 O! [- R1 J: [( b1 y- nfloat CalcBinTree(BinTree *Tree);- Y; F- [" O/ R |+ ^ k float GetFormulaVal(int *Formula,int count); " h z/ x9 _; E/ ]' zvoid ShowFormula(int *Formula,int count);8 S/ |1 Y- E2 l% r' t7 v+ o1 T void AfterNode(BinTree *Tree); & _! Z+ U8 j- `3 k yvoid GetFormula(BinTree *Tree); . S% R8 q/ M9 ovoid Myitoa(BinTree *Tree); 3 t5 A5 }3 y$ _int EnumFormula(int *FormulaNum,int num,int sum);1 P3 ?. {! ^5 r# V: ^ void Restore(int *Formula,int *NumSym,int *temp,int count);' T8 o4 Z7 ]; ` N int IsOK(int *Formula,int count);6 p2 A1 C: |2 L% m3 I int FindInt(int *nArray,int n,int len);, C b8 p6 j: ^ int UpZero(int *nArray,int n);+ j2 g7 L8 a [ int IsDownNumSame(int *temp,int count,int num); }: V! K5 \! d: J1 R & _' }/ a$ n# y, g const char cSym[5][2] = {"","+","-","*","/"}; ' Z6 B! B- C: H5 K , P" x, G! r# Z! r" i8 ^int main(int argc, char *argv[]) 6 [% |5 m+ B7 f/ J m{" P+ T0 O+ s1 L0 M int i,n,*Array;: t* h3 H; Z5 v" } 9 ]' r( Y7 Q6 D0 F- n5 p# i2 D //printf("几个数?");5 e1 j. `- _) J //scanf("%d",&n); / ]3 @5 X5 Y1 o! D n =4; ) o9 ?: b) U, P# p2 J Array = (int*)calloc(n,sizeof(int)); ) [8 Q: I* x- v3 q! E5 s printf("请输入%d个数(用回车或者空格分开):",n); ^9 v3 z5 d, w for(i=0;i9 j/ b9 J; P1 e8 f scanf("%d",&Array); 3 v4 D/ \, v8 t printf("总计%d个式子\n",EnumFormula(Array,n,24)); * ~6 D* Y" D3 z0 Q W free(Array); * F; g! c) X+ f$ F y8 v 4 V1 Z( f) N- }* P* c# h system("PAUSE");! i) T4 [4 B3 s- y" m# f* d return 0;/ u7 S. H; P. o3 h$ r2 W }5 i4 Z G4 E" P6 R6 K 4 c% }! k4 s& ^/ F7 aint EnumFormula(int *FormulaNum,int num,int sum) / P, W: n! Y- Y# u, [$ ^3 {* i{4 J4 t& [( s* Q! Z2 D6 M' B9 h int result = 0;- s3 a, o2 b$ k; C: Q int *NumSym = (int*)calloc(num+4,sizeof(int)); //操作数运算符组成的可枚举组9 N+ n- w% l0 I3 R% ^9 @" G int *Formula = (int*)calloc(num*2-1,sizeof(int)); //波兰表达式储存空间3 p, h7 x3 D; a int *temp = (int*)calloc(num*2,sizeof(int)); //波兰表达式的代号表示空间 ( E! f2 \! V& Y int i,j;( @& F3 b2 A' Q, G' b, s for(i=0;i = FormulaNum; //载入进行穷举的操作数2 k" H9 a' s) q+ C* R) j# U9 v for(j=0;j<5;j++) NumSym[i+j] = -j-1; //载入进行穷举的运算符号' ~( B9 J8 g6 [; B! v( S + S' z8 U' Y1 o. z" O/ h for(i=0;i = 0; 5 b6 ^$ M' l* [9 U+ a // 穷举开始,结束的标志为波兰表达式代号空间最后一位已进位,即前面各位已穷举完成 7 S/ ]6 O5 j5 H( V. V7 s while(temp[num*2-1] == 0) p, C& j5 K# F' a# L1 h { 2 C' S: L& Z; I6 y2 z$ x if(!IsDownNumSame(temp,num*2-1,num))3 x( Q7 b5 C* ~8 b% D" M( G {/ l8 g% M; z T6 c7 I! z3 f Restore(Formula,NumSym,temp,num*2-1); //还原波兰表达式 6 G8 q# B8 Z" Y5 f5 ^5 E( ~3 g# U if(IsOK(Formula,num*2-1)) % p: [3 z3 f- s& l2 e { 3 d1 k( K O- L" _1 r float t; //结果偏差 ) K0 Y/ }/ p' A; T t= GetFormulaVal(Formula,num*2-1) -sum; - c+ f( I3 B4 q/ c if(t>-0.01 && t <0.01) //结果为浮点数,只能进行近似比较# Z2 c6 @& v( X5 \) T2 E2 g. O { & _8 W; u/ W7 }( p! y2 _, L result++;7 _* b5 \. l. X) W5 i ShowFormula(Formula,num*2-1); 1 ]; @9 O+ {( n0 s5 }, @3 ^/ C2 b* l) ~ }2 D) b4 _1 r6 w( T. C+ C7 Y; L! Z% E } 9 d( ~4 N) ^# G( B7 ], @+ l; A }2 i$ Q/ s0 O$ o- q temp[0]++; //穷举动力 * ?6 ?6 k$ g1 z8 m2 V/ w& U" B for(i=0;temp > num+3 && i//代码空间类进位 0 i2 _( e+ {2 C {& W+ p% G6 N* L! P9 W. g temp =0; : o! a3 r% W6 L# h* y: U& p temp[i+1]++;, d0 W# c" o. y* S! n: Q }1 j: G9 }8 a5 g0 j2 \ } 8 F# j4 b" v# W( F% g // 释放内存 H( ^! [% p! c7 }! ^* g free(temp); 7 o, ?; E/ u: o# S1 M% Q4 l6 w/ J: G3 e1 b. `) d5 g //free(Formula); //??此处不知为什么会出现错误 $ {/ M8 i) r7 g* S4 R1 ]$ Y4 S free(NumSym);' O$ i- I- v' B1 O return result;( v' Y) U) q& }+ }$ T* ]4 I4 D } - Q2 F& M0 @! {" ~1 @2 K4 n* r// 由代码表还原为波兰表达式- ?; ^7 J1 m- J& E3 a2 _5 { void Restore(int *Formula,int *NumSym,int *temp,int count)7 h1 w1 ~" }7 e" V7 R3 [ {) |5 a- c/ S) ^, R9 z* e( { int i;: ~2 S: ~4 |' ?/ W for(i=0;i = NumSym[temp]; & j9 N+ g) a! M" g/ \} ) c q' l: C' }; [// 判断是否符合波兰表达式: K9 r4 y$ s2 L, H, G3 a% X4 X) I // 符合的条件是每个运算符号前必须是操作数个数多了运算符个数/ Q8 T) U7 ~8 ~/ X // 且运算符个数为总数减一的一半3 K; J: h4 K8 M2 t3 t- D int IsOK(int *Formula,int count)# R, K; M( N; s* r {& ~2 G1 I- t: E3 Q/ k J int i,j;0 l+ w# V" V2 h" |7 E- h! ~ for(i=0,j=1;i7 R* f$ T1 {' w4 i7 \ if(Formula<0) - N" w1 Z7 F/ C7 O u' R if(UpZero(Formula,i)>j) j++; W! F2 Q" | {1 m% n6 a else break;5 e0 _9 r& i; g6 l6 F if(iint)count/2+1) return 0; + L# x# [0 U. q+ R else return 1;5 L! U; R) e2 `% J }7 W7 c( q5 R& o$ X. K$ D* y" K1 g // 查找数组大于0的个数 ! r) d* v% F: lint UpZero(int *nArray,int n)- H# p' H8 T$ z( j( ` {1 t3 p; }2 X! R3 ]/ S" h int i,result=0; ; f6 S9 ^! Z3 Q. R q; ~/ [ for(i=0;iif(nArray>=0) result++; 2 B4 R% ^2 S+ P+ b& W) I return result;' U. w4 u+ V5 B( {7 X/ f! k6 ^ } ) u! R6 b/ ]* i1 O0 d// 查找数组中,小于Num的数是否有重复6 h& \$ `+ G* l" ] int IsDownNumSame(int *temp,int count,int num)2 h5 V7 t! Z$ M {" k8 B4 k! {$ A int i;7 q, C8 m! r. E. H$ j for(i=0;i# p0 D9 }6 { V }7 D. x {3 H% S8 N9 I2 t% P: U- @ if(temp < num)+ O& W- n" x, k: C+ |. ?8 e if(FindInt(temp,temp,i) != 0) return 1; + `, D' f% w& Y- t* X$ l } , n; Z. h" v, ?8 u return 0;6 X& [1 c! [" Y- R1 U }# J' L+ d$ ^5 F3 a7 h h; j1 ~ // 查找数所在数组的位置,返回0为未找到 4 @( j) s; K0 ?! fint FindInt(int *nArray,int n,int len)" z+ \* l0 |# i3 L( b: C6 G T& h) w { ! Q) J [" W. I9 F int i; , @9 C& ?9 V5 E% Y( [+ `7 d for(i=0;nArray != n && i* F( }+ i" G' N* R if(i>=len) i=0; ! ?3 e0 R3 \) i6 N5 v else i++;$ n4 s: @0 G! Z* o2 C: p return i;4 D [5 O4 Y3 L2 d' J6 H } " W8 t& `3 G: \3 H* W- L4 w- M3 x# I" S+ W // 计算算式结果 & f) J1 j3 a6 F; B1 zfloat GetFormulaVal(int *Formula,int count)1 f; i& u, e2 {7 d% ], t { U8 K( z$ Y% x0 K9 H" M5 W' I( O float result; 5 Z. e$ b- x8 d/ U, }7 m BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点 + v5 E1 Q8 k. m1 O& m' y D int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度$ K" j- g& d7 I' T0 G8 V ! x2 R# W& e) }5 h; j- u, ?0 H int i; + w, f# y- L- L* W for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式2 {- Z; A9 m' d9 o5 C nArray[0] = count; 2 t6 y+ d! e- J0 | CreatBinTree(head,nArray); //建立二叉树% ~ S& Q- z0 x: Z6 L' I9 J i; v+ C P. E. j: I2 ]9 U4 `% i7 v result = CalcBinTree(head); //计算二叉树算式 , e& Y+ {5 `3 F3 C# x; J, h2 |, b AfterBinTree(head,&FreeBinTree); //释放二叉树空间: S1 @( t) W. m% Q; \7 N3 v0 `4 V 3 p0 i) ]0 r' z free(nArray); 6 D8 |% K' l5 F, {! Z return result; 6 H+ Y* A- w u- [! h} $ T T. ~; n" e5 N- ufloat CalcBinTree(BinTree *Tree), T9 r0 Y/ W8 w1 G$ w8 R. \ {5 M- p* J y" F! c/ `- C# p$ k, c ' o2 ?7 ?9 k/ R' z$ L: Z AfterBinTree(Tree,&AfterNode); ) x1 |1 q+ x- v1 f3 ] return Tree->Data;" j0 d+ E- s% P4 t6 g7 ~ }& ~! [) t0 B9 i+ s. T9 }( [ o5 T 3 Y- [' b+ s- d8 w: |/ W // 后序遍历二叉树进行计算,但会破坏二叉树本身$ s. H; x8 Q$ @' H // 一个结点的结果为左子树 (运算符) 右子树( j* y/ Z; _. n void AfterNode(BinTree *Tree)9 p9 O+ v C. \" z$ n { 6 W6 [" r' M' E1 w) d/ j2 r4 p8 z switch((int)Tree->Data) 6 k# Y/ }6 o7 ^, g# F { * R% K# M1 Z) R$ I6 |- n. E: q case -1:( o" t5 Y! n% S- R Tree->Data = Tree->Lchild->Data + Tree->Rchild->Data; + X6 t1 I7 @, \9 _$ R break;; j0 g9 c; `. g( t7 `, p! h" n case -2: ; x2 f: ^/ d% ^ |" m& K3 L Tree->Data = Tree->Lchild->Data - Tree->Rchild->Data;- G: Q9 f$ g2 `2 |- d break; # x" j% K' p, s/ | case -3: 3 g# ^0 I+ h S( W: x$ }4 w Tree->Data = Tree->Lchild->Data * Tree->Rchild->Data; " f( b! v4 }" ]9 a& q break;1 X( [* n; `. S case -4: 0 o% a$ D* E5 R2 m# H! A Tree->Data = Tree->Lchild->Data / Tree->Rchild->Data; " C: c8 Q! G4 z- ` break;. Y7 {8 @& F- B7 L }4 ?" |' U {* g& l }4 E" x7 z$ l* z5 _& N% z // 打印算式' }+ }3 M9 ~* C% M3 H ) e5 z( ~$ G' [, x" g9 `( U4 B3 Fvoid ShowFormula(int *Formula,int count) # g9 D: j! F, c! h{+ w+ i+ d! q, Y BinTree *head = (BinTree*)malloc(sizeof(BinTree)); //二叉树头节点 0 Y) E7 [2 G" ^ int *nArray = (int*)calloc(count+1,sizeof(int)); //波兰表达式储存数组,首位表示数组有效长度 / ~2 U% X5 F9 C% M7 d3 u& z, N6 n int i; 9 G6 Q3 I9 i. h# R K) _ for(i=1;i<=count;i++) nArray = Formula[i-1]; //复制波兰表达式 1 h7 }. j3 `- o! I$ D6 y; _* r, F6 I nArray[0] = count;+ g$ t$ j1 H+ e8 V7 K CreatBinTree(head,nArray); - Y3 W* A# A* K N AfterBinTree(head,&Myitoa); //初始化二叉树字符窜部分2 t. L; ]7 U4 n/ g AfterBinTree(head,&GetFormula); //转化为普通表达式 8 k V& d1 g) \2 {" m printf("%s\n",head->Formula);: V) r3 x& y4 f" U8 m AfterBinTree(head,&FreeBinTree); //释放二叉树空间7 c- L& W' o( u& S free(nArray);3 g1 [9 ^" C6 v9 ~ ' F1 D& A$ b/ q6 q9 k } 0 w- K2 L. _: v4 y+ S" V" n// 类似计算二叉树) r) e0 w/ o) H/ @3 z // 会破坏二叉树本身9 D" q) x$ a) L void GetFormula(BinTree *Tree)* `3 T' ? t0 V" P9 P8 x {* M$ u8 j5 D7 Z6 [ // printf(Tree->Formula);9 p4 M! z- I( r3 T. T' b3 V* R if(Tree->Data <0). g) j# e V) h+ w { # {3 n2 d, a8 R* Q5 ~" V4 R) v char temp[100];) p; ], U5 ^. T$ ? v- D if(Tree->Lchild->frist < Tree->frist)/ L j0 \6 J' H' U { ( K7 g: F* f) a& a strcpy(temp,Tree->Lchild->Formula); " s# d3 _0 |2 j) j8 K strcpy(Tree->Lchild->Formula,"(");( e/ l) o1 c: W0 K# ^ strcat(Tree->Lchild->Formula,temp); 7 u; M& M6 J: ?: M2 l strcat(Tree->Lchild->Formula,")"); 2 S4 Y! }0 }1 q }. v" m. Q6 p1 ^8 v if(Tree->Rchild->frist < Tree->frist8 O1 ?- Y1 P1 w6 ^ || (int)Tree->Data == -2 && Tree->Rchild->frist == 0* ^: T( D0 X2 |0 \' N || (int)Tree->Data == -4 && Tree->Rchild->frist != 2) : d# b5 c1 |& L! { {2 _4 e7 N! U, v5 V+ K, W8 u strcpy(temp,Tree->Rchild->Formula); : }$ m8 f) k3 L8 L' h! Z9 v4 o4 F strcpy(Tree->Rchild->Formula,"("); $ I+ I! E5 A# `9 g* A strcat(Tree->Rchild->Formula,temp);9 m( p7 W: {3 m8 Z4 D strcat(Tree->Rchild->Formula,")"); # ]3 h R( Q# t) \+ `. @5 g }3 ~1 F8 t& |; n( X. e' m8 f$ o: A strcpy(temp,Tree->Formula); O7 z9 v' ?2 S# B) y# `# K+ R strcpy(Tree->Formula,Tree->Lchild->Formula); ) a0 B, ]7 C/ X! J" _ strcat(Tree->Formula,cSym[-(int)Tree->Data]); 8 d' F# ~, ?' O, Z7 O2 b( c s# W strcat(Tree->Formula,Tree->Rchild->Formula); 5 D% l9 R' s3 V& {+ g }) {; X/ k/ u) C1 r# q/ t# y }2 i5 C" A ^9 Y! U( S9 E; P // 对二叉树字符串部分赋值 ) w2 y/ A) D4 o5 M! E4 Xvoid Myitoa(BinTree *Tree)9 g4 F, L. a" J1 s6 u6 C {1 d8 T" S; E; m( h3 W o6 O+ M if(Tree->Data>=0) 6 M: r1 t4 S: v7 D {6 M0 U, \. W% m$ v itoa((int)Tree->Data,Tree->Formula,10);& X/ p) |& F$ R" V Tree->frist = 2;# D( s' t K4 L. E A } 6 U, k% E5 I' ^+ G+ H) N else/ L$ A$ m5 F7 `# x+ X9 K, g Q: @0 C { * ~2 _5 m# f- T- n$ u Tree->frist=Tree->Data < -2 ? 1:0; : C* Q5 I+ `& G% h6 V5 ~ strcpy(Tree->Formula, cSym[-(int)Tree->Data]); % g* m! s" f) G: E //Tree->Formula[1] = 0;: i/ u" G% i9 m8 t } 2 r" I$ \/ ]/ H7 t} ! _8 @/ _% i6 u; i( ?//从一个波兰表达式建立一个二叉树链表,需指定一个头节点 6 N. D7 R" d% F& T3 i. R- ]5 f$ Vvoid CreatBinTree(BinTree *Tree,int *nArray). t5 r2 ^$ U7 _4 u4 H( K { 0 y7 Y0 T2 l$ \- t4 M. C) S Tree->Data = nArray[nArray[0]--];8 u' o) [- \. g- |* g6 e" S if(Tree->Data < 0) $ M; `; m( z- y) U9 C) D { ' \" p# x5 Y! ]0 }, y h! w( F2 B Tree->Rchild = (BinTree*)malloc(sizeof(BinTree)); E' _' }+ a% K5 V5 q CreatBinTree(Tree->Rchild,nArray);2 R( D9 i6 b# y0 _! O8 \ Tree->Lchild = (BinTree*)malloc(sizeof(BinTree)); ! S' e0 C9 B1 e9 \ CreatBinTree(Tree->Lchild,nArray);7 g" C/ H5 I0 q* c4 @' v% o; J: N }% k/ ]5 @! \1 e) J1 ` else% P' b- v9 B# O& y( C; { {* X) N9 ~3 f. u/ F z; H6 ^ Tree->Lchild = 0;4 W' e' s; a8 l9 z! Y& D" \' m Tree->Rchild = 0; 5 k) u) |+ e; U7 W/ q }/ d2 t: A2 U7 m/ X % i( B8 i- W, i- N# V, { X }& j' v' e8 H b0 { 3 W6 u' v* C: v3 c6 O' j! X // 释放二叉树空间7 u+ C' b6 g+ \' d9 j void FreeBinTree(BinTree *Tree) 6 C& H% P2 ?7 M{ 9 X8 D' r2 K/ N8 ?: d9 _ free(Tree); 0 ?% S9 P5 F" C7 y} 8 Y$ S; p' H" L5 Y// 后序遍历二叉树3 m- \7 U8 c4 ^! O: N // 方便其他函数调用,func为要对各个结点进行操作的函数指针 3 Q6 f& K) P" s: Qvoid AfterBinTree(BinTree *Tree,void func(BinTree*))+ M+ ^/ b; X" }, G/ t { ' i" Y2 C! Q, v* Z1 S, Q* [, y if(Tree) & L# R G/ h2 O4 k+ t( q8 _" I5 Y { ( n B+ U4 g) A AfterBinTree(Tree->Lchild,func);0 x0 ^2 [8 _- ]; f @ @0 {9 d AfterBinTree(Tree->Rchild,func);' L1 w m8 O& w# i func(Tree);: H* _9 b2 Q2 e: p$ B }0 V3 J% a! Z- t( c" e } ! z; M5 W, s2 m ^# E( s2 c2 o

    本版积分规则

    关闭

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

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