返回列表 发帖

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
) D% r( v5 _2 M% Z2 D一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 K  X! N5 S* p, [1 Z9 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& n1 ?: B2 y  Y# J* j+ i( ]
参数解释:3 r) C6 f9 j) _  Q7 M/ U2 t8 N
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* S; y  K: M& N& @2 \( A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! L$ E9 J7 ~5 S' D返回值:
# Y8 n: a8 L3 ?5 G返回非0表示计算成功,0表示计算失败有错误' I+ `& M. c" r8 u7 i, _( d
! |9 i6 R. J/ K9 E) ]1 R- x5 q( S

& f- K) G' T6 ?5 Z( x- D+ p% ?$ Z. e$ g0 F; X
程序代码:
3 w1 ]5 b) O/ A4 Q* w% s8 G0 H; K$ i5 `
namespace fy_Exp{& Q$ `2 N9 `6 k/ o- j( B$ s% k, e) G
namespace {template <class _T>' G# f2 |- b% A. \  U$ R4 z
inline _T GetExpValue(_T t[], char& csym){
8 b3 h" g& @1 a, |  @) [$ O+ {$ l    char c=csym; csym=0;
# r$ k  C0 @& g5 ?    switch(c){, w0 g; r: b- D) r
    case '+':return t[0] += t[1];" f  v% T' N9 C9 K5 M- ^
    case '-':return t[0] -= t[1];' _$ U' m, c+ e8 |) b. d
    case '*':return t[0] *= t[1];
& l3 [0 X2 y& H2 k, U' v! \    default: return t[0] /= t[1];//case '/':- ~) r' r9 C9 @8 o3 z4 X
    }/ |" ^4 G5 T& f( ]7 A% |  ^9 {
}}
( R- u/ Z  p( ~% Vtemplate <class _T, class _Tstream>6 C0 l* w: z$ J8 e+ J
/* _Tstream: inputstream, _T: get return value
/ S5 I( Z5 R2 C/ N5 w, W8 h$ N* Return nonzero if get value successfully */
, h. U; A; q" x1 Wint GetExpValue(_Tstream& istrin, _T& nReturn){* I: ^9 m4 c) v6 J4 k* ?
    _T t[3] = {0}; //雨中飞燕之作
# K- n  u" G3 U$ U    char csym[3] = "++";
" e: P* |! l0 {/ b    int nLevel = 1, nERR = 0;4 G; Y. ~- u. y& o
    if(!(istrin>>t[1]))istrin.clear();$ V5 v% L( Q7 _  o3 j! n, W8 s
    for(;;){
2 K& \- ~2 i3 w6 l2 ^5 j6 j        if(istrin>>csym[2]){
- P$ \! [' N% ?. j% _            switch(csym[2]){! e' T# C/ h5 _+ T5 S1 o
            case '(':
" a9 U7 M# l& l5 `5 l3 D2 P8 M8 j                if(!csym[1]){nLevel=0x100; nERR=1;}else' T8 Y! ]& H9 T: G* ]: |
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 I  _0 y: X& @3 Q/ `4 }) z3 u
                else{nLevel=0x100; nERR=1;}
' }4 d5 i8 v3 O5 g! z                break;
+ e; }+ U; K3 h1 W7 ?; e& J            case ')':( _2 A$ g/ C" w) d( g/ x
                {nLevel = 0x100;}break;/ E% n& E; D% J
            case '+':case '-':case '*':case '/':# f2 r; f( Z6 A  O* u5 }8 n0 G
                {csym[nLevel++] = csym[2];}break;) m( B  N* P3 B0 A' [: `
            case ' ':case '\r':case '\n':case '\t':continue;
; H( l3 x3 r% \            default:$ E! P( H, M. M9 \1 f+ r! w- Q. H
                {nLevel=0x100; nERR=1;}/ X+ ^& x7 q+ C: B# @0 O
            }
0 M6 |/ a& p* ?! O3 \; b: p            if(nLevel==0x100)break;
8 q) q, P1 i( ^            if(nLevel&0x10 || istrin>>t[2]){
( k( X' w; b7 T1 U3 j                nLevel &= 0xF;3 b. c( p! n0 k) W( q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" t8 l6 n" t* f8 A4 [                if(csym[1]=='*'||csym[1]=='/'){
: C1 a, H2 t% t# A+ K                    GetExpValue(t+1, csym[1]);
$ E  B& x& d3 [4 t" Q4 K, G                }
7 }$ C0 f, }  {" H  O6 z                else{
9 y& E9 v& V7 ]' Q                    GetExpValue(t, csym[0]);
. B  g: X. x0 l, j5 M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 L8 C* k2 _3 |$ x& y7 d                }
: ?3 g" r, [/ O6 u% s: f$ a9 e% C1 i                nLevel = 1;$ m9 p% A# T3 f" z/ M" }5 [
            }1 j- d. z+ g7 c: V/ p* f0 N: E8 S3 I% J
            else istrin.clear();5 Z" z" _/ {) m5 i0 A1 K* o* L% s$ d
        }
/ ^, H; p4 T) U1 b/ Q+ }. o" P% d        else{nERR = -1; break;}
5 C: a2 g: h* W- ?6 i& R    }. Q8 c9 F6 I; A& I1 x. O
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' ^" @4 k0 ?$ X
    else nReturn=GetExpValue(t, csym[0]);
) Y. X) k0 ?- X8 B    return nERR==-1?1:0;5 a- _7 @2 L0 F4 k9 a! I: C
}}1 a7 r# S, m0 r. Z9 `0 f! p

% o1 `" x$ D! y% {5 T9 |. {% B5 l$ T) e' n# b
' o/ P7 e/ u( m9 V% ^% m0 Y' S
函数模板使用示例:; _  a- Z$ a  f  ?7 B' e
在以上那段代码的后面加上以下代码:5 t5 P* K1 L% L

  q: k$ o" X7 n$ L) q# ~ & g% T7 \1 _5 \+ t! r3 T. q
6 A4 d1 w. J6 [) R$ i. a9 w
程序代码:
8 ?0 l( x2 w/ t, Y3 H6 D
  e5 Z; E0 l: E9 J$ H4 |; X3 D#include<strstream>
# m1 M/ c: N- @# T& W/ S#include<iostream>' N: C# T" ~9 {4 B% L
#include<string>6 T! B3 Q1 T  h( @
using namespace std;" Z6 z1 M  y  @1 s1 |1 A0 o: T
int main(void)4 S/ X9 @8 K% u9 c; _& y  A1 n
{
! K. L, ]- ^4 |2 J    string s1;
) @5 ]' I6 c% P0 R    while(cin>>s1)) ?. K- I6 {; ?6 u9 z7 {8 f% t* R+ l4 W
    {
9 E  B! a4 V' M* U        istrstream isin(s1.data());1 {. J4 ^: G% A5 I1 z
        double d;8 p6 T7 K7 m# O) O
        if(fy_Exp::GetExpValue(isin, d))
2 j+ I8 G2 p  e& ~$ g7 J        {& ~% w- Z& J( o4 _' I0 T0 V0 ^
            cout<<d<<endl;
, e+ m5 `  n- B& W        }
/ p4 R$ Z; g- |1 D8 m3 l- S        else
* o/ f: w. |" w+ U  w1 ~3 B6 l        {3 ^7 N  Y9 }7 h5 P; _
            cout<<"ERROR"<<endl;: L2 m4 ^* q  t  m! W5 a
        }+ F! T2 H3 t! E: T& G
    }
! L$ `. N( v. F: ~    return 0;
8 L; l( B6 L* f% g, H/ j' l}  H- w6 B4 i( V4 ]! H# G, v, c# \; g

. C0 w8 e, _3 g
; `7 V+ X7 ^, E$ e. F然后编译执行就可以了(*^_^*)
! [  R; e" ^( D8 C5 ^+ T$ \其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ L9 S2 m- o7 e) N: {- f& t* e8 g
      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: