返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 P4 `8 X8 H0 T& u一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 ^& k9 l: o, u% f* o8 Y2 E# z+ I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). X5 K) a0 n% K- c8 R
参数解释:: W) j4 O8 [) ^6 g1 B5 J' \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 q) m6 [$ n2 Q3 l0 W( |$ R" c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: b6 C4 E2 ~: w$ r8 r) i+ c
返回值:# x3 F1 Z- O2 w: @* U; @8 o
返回非0表示计算成功,0表示计算失败有错误$ }6 w3 e! ?" K+ b" O: ?
5 ?4 |* e; i7 Y% L- Q0 y& R

, Z- V' i6 e3 R& G. A! T8 g
( u! c' v. L& Z! }# M: e# [+ |/ I程序代码:
! l" j, b# G) H" G4 L
  m2 Y9 \& V5 X* V; v7 D! ?namespace fy_Exp{1 L$ e& A: u3 [
namespace {template <class _T>
: E: p/ D! b- binline _T GetExpValue(_T t[], char& csym){
, e1 n8 ~8 _. _0 f3 n    char c=csym; csym=0;
! g0 D# W( z0 P    switch(c){
& m( o! }9 K4 i    case '+':return t[0] += t[1];
4 o) d3 ~9 Z8 W  F# O, |    case '-':return t[0] -= t[1];
* O$ b# F* X# X2 a- G: L3 F- I8 u    case '*':return t[0] *= t[1];. u3 e& w. M8 H/ ?* D9 i7 T' s
    default: return t[0] /= t[1];//case '/':
: Y8 d/ S+ ]8 @, [" Z( h    }
% K  |1 ^$ N+ W0 ^, y: B  W. g- a}}
+ c+ {! Q5 F1 I- S" ?) F9 L  Stemplate <class _T, class _Tstream>) i" |& U0 J3 M+ k
/* _Tstream: inputstream, _T: get return value
2 c) p6 n( J$ R: z( V- e* Return nonzero if get value successfully */. C7 m3 E" g9 Y: K
int GetExpValue(_Tstream& istrin, _T& nReturn){
" w% @  q, a  b$ |    _T t[3] = {0}; //雨中飞燕之作3 U1 d7 A" R$ R, S
    char csym[3] = "++";
% N4 u- N% k( u    int nLevel = 1, nERR = 0;
; g4 D9 |( Y8 N3 }* _: I& z8 S! J    if(!(istrin>>t[1]))istrin.clear();5 _$ O9 B& O0 H% Z. W' t: A
    for(;;){. |, I6 u6 b) H- ?  A7 b/ ~* x
        if(istrin>>csym[2]){
5 f9 m/ p4 p/ I8 `            switch(csym[2]){
5 h- P8 ?4 N* t& I+ |! l  F" \            case '(':
& g  Y' I5 O# n, e  I5 E* f8 O                if(!csym[1]){nLevel=0x100; nERR=1;}else: @3 j, y8 g  Q' P1 {2 E) W* K
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, l) |* Z) ~2 v; j0 I$ ~
                else{nLevel=0x100; nERR=1;}) N1 l  x0 a+ T- T  G0 e4 L
                break;5 B% G6 d3 e8 K3 t2 _' l
            case ')':- D/ Z5 f4 b& ]* Q3 K$ J
                {nLevel = 0x100;}break;7 o! j' Q! X1 m) ^2 @3 v8 L
            case '+':case '-':case '*':case '/':' U; `  E6 [' R: ?2 d5 P/ W
                {csym[nLevel++] = csym[2];}break;" r! X6 {+ ]3 F; r
            case ' ':case '\r':case '\n':case '\t':continue;( Y5 s6 {7 R. X/ X# S
            default:
6 d7 x  @, i# I% e9 a                {nLevel=0x100; nERR=1;}1 y: \+ d, Q* E( Q5 F
            }
+ C0 j, k) h( h& p- G            if(nLevel==0x100)break;* l$ b7 J8 D" c+ A/ I, f
            if(nLevel&0x10 || istrin>>t[2]){* T  W; V9 e) b- B5 B; C
                nLevel &= 0xF;' E" R% b7 X0 M9 P+ N+ O/ H9 k
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( `9 k# ]8 T2 G( |  B8 J                if(csym[1]=='*'||csym[1]=='/'){5 C# J7 B4 O0 }- N
                    GetExpValue(t+1, csym[1]);% Y& M( \& ?* h! O9 B0 s7 G
                }9 g; ?- ], p8 {0 j; c
                else{; r. w, U' b, B5 N
                    GetExpValue(t, csym[0]);! N8 ]1 K4 u1 A' D6 N) ?1 g
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, b6 c6 N/ j# ~                }
) Q) M) i: k, \/ ]% D                nLevel = 1;% L- g( g+ y. A
            }/ d$ N/ w5 _) }
            else istrin.clear();
8 s: F2 F9 U4 c9 P, }. [        }4 K7 k# H4 Z* X) \: a3 }
        else{nERR = -1; break;}& u4 W* z- k& w$ d9 ?( b
    }
: h/ }0 r  z8 t/ u# f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' E; t7 g6 F: |+ y6 L    else nReturn=GetExpValue(t, csym[0]);5 l4 u/ p: I  }7 |/ C) x
    return nERR==-1?1:0;* Q0 ^8 z" B$ ^) t5 e
}}
. Q1 d9 R* h6 b( `; [# K7 }9 J2 k  r
0 ^! t( c8 \* U& v

9 |1 D3 r* y/ y! g% Q) [" A4 R$ f函数模板使用示例:
$ W2 K6 s, m# ~9 v! Z% c' k  t在以上那段代码的后面加上以下代码:
% H" c0 n  _7 {1 [
1 V3 ]$ [3 H$ l( W& e1 O2 f
- G8 r- R2 o/ ]1 e8 N+ i1 B1 r  a, D, a* t) n4 [/ x
程序代码: . J8 [. L2 }$ u" j9 {
- G3 i! R. w$ _
#include<strstream>
5 N% K1 v' d. G. j, k- M& A#include<iostream>
3 m' i( D' [2 z# A* C$ X#include<string>
7 Q+ o* `! ^) C+ M: U6 k1 zusing namespace std;3 r5 R, l% R, J* s
int main(void)1 q  W# x7 R( U+ T/ d. K
{* T/ Z7 z. D4 C6 p/ C5 y) ~
    string s1;# A0 j: b, k* b# S- u. d
    while(cin>>s1)
7 i3 ]6 z; y, ]$ Y    {1 M5 t% \# l! c! ^$ k
        istrstream isin(s1.data());$ |/ k9 ]2 q, D: ], r: k
        double d;
# }2 v4 K* w% n' r        if(fy_Exp::GetExpValue(isin, d))
7 l: I7 z# r! {8 A6 c( d4 }        {
5 D! d3 t7 \4 [$ Q" N: T+ i            cout<<d<<endl;
% d; m' z& K* S2 q; E        }
- |4 G7 n7 w% r6 P! l; Z        else0 \; D6 F" [+ U7 E( H' ]
        {
% G7 e6 i% l& P4 Y/ C! D            cout<<"ERROR"<<endl;
$ B- m: Y* s$ ^5 I* A4 b3 i        }
& D) m' x! R/ r% n. p3 [; F% X    }, ]+ O- H0 f; L0 Q3 |1 w: B2 \
    return 0;
7 X, @9 b+ \' ?3 x+ o}
. Q, i5 ~- v; |4 z6 d, ~4 F/ `# y, G- }. q# }# K

9 y4 v: U0 y  H" [7 e$ r3 b, P& S1 Q然后编译执行就可以了(*^_^*): @7 n0 R: l. [# I% b2 U, \6 q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 k3 R3 S; o4 ]0 b
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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