实现方法一:用递归来实现。
CString CCalculatorDlg::calc(CString str)

...{

CString str1,str2,str3,str4;
str.Replace("+-","-");
str.Replace("--","+");
char ch = opera(str);
str4 = str;
switch( ch )

...{

case '(':
str1 = str.Left(str.Find('('));
str2 = str.Right(str.GetLength() - str.Find('(') - 1);
str2 = str2.Left(str2.Find(')'));
if (str2.Find('(') != -1)

...{
str1 = str1+'(';
str2.Delete(str2.Find('('), 1);
}
str3 = str.Right(str.GetLength() - str.Find(')') - 1);
return calc(str1 + calc(str2) + str3);
break;

case '+':
str4.Delete(str.Find("+"), 1);
if ((opera(str4) == '1') || (opera(str4) == '-'))

...{
str1 = str.Left(str.Find('+'));
float a = atof(str1);
str3 = str.Right(str.GetLength() - str.Find('+') - 1);
float b = atof(str3);
float c = a+b;
str2 = "";
str2.Format("%f",c);
return str2;
}
else

...{
str1 = str.Left(str.Find('+'));
str2 = str.Right(str.GetLength() - str.Find('+') - 1);
return calc(calc(str1) + '+' + calc(str2));
}
break;

case '-':
str4.Delete(str.Find("-"), 1);
if (opera(str4) == '1')

...{
str1 = str.Left(str.Find('-'));
float a = atof(str1);
str3 = str.Right(str.GetLength() - str.Find('-') - 1);
float b = atof(str3);
float c = a-b;
str2 = "";
str2.Format("%f",c);
return str2;
}
else if (opera(str4) == '*')

...{
str1 = str4.Left(str4.Find('*'));
float a = atof(str1);
str3 = str4.Right(str4.GetLength() - str4.Find('*') - 1);
float b = atof(str3);
float c = a*b;
str2 = "";
str2.Format("%f",c);
return "-" + str2;
}
else if (opera(str4) == '/')

...{
str1 = str.Left(str4.Find('/'));
float a = atof(str1);
str3 = str.Right(str4.GetLength() - str4.Find('/') - 1);
float b = atof(str3);
float c = a/b;
str2 = "";
str2.Format("%f",c);
return "-" + str2;
}
else

...{
str1 = str.Left(str.Find('-'));
str2 = str.Right(str.GetLength() - str.Find('-') - 1);
if (str1 != "")

...{
return calc(calc(str1) + '-' + calc(str2));
}
else

...{
return calc('-' + calc(str2));
}
}
break;

case '*':
str4.Delete(str.Find("*"), 1);
if (opera(str4) == '1')

...{
str1 = str.Left(str.Find('*'));
float a = atof(str1);
str3 = str.Right(str.GetLength() - str.Find('*') - 1);
float b = atof(str3);
float c = a*b;
str2 = "";
str2.Format("%f",c);
return str2;
}

else

...{
str1 = str.Left(str.Find('*'));
str2 = str.Right(str.GetLength() - str.Find('*') - 1);
return calc(calc(str1) + '*' + calc(str2));
}
break;

case '/':
str4.Delete(str.Find("/"), 1);
if (opera(str4) == '1')

...{
str1 = str.Left(str.Find('/'));
float a = atof(str1);
str3 = str.Right(str.GetLength() - str.Find('/') - 1);
float b = atof(str3);
float c = a/b;
str2 = "";
str2.Format("%f",c);
return str2;
}
else

...{
str1 = str.Left(str.Find('/'));
str2 = str.Right(str.GetLength() - str.Find('/') - 1);
return calc(calc(str1) + '/' + calc(str2));
}
break;


default:
return str;
}
}

char CCalculatorDlg::opera(CString str)

...{
if (str.Find("(") != -1)

...{
return '(';
}
if (str.Find("+") != -1)

...{
return '+';
}
if (str.Find("-") != -1)

...{
return '-';
}

if (str.Find("*") != -1)

...{
return '*';
}
if (str.Find("/") != -1)

...{
return '/';
}

return '1';//字符串中不包含以上几种符号。
}

实现方法二:用堆栈来实现。
此程序只能实现1-9的四则运算。在表达式最后加一个‘#’表示表达式结束进行运算。
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define increment 10

typedef struct

...{
char *base;
char *top;
int stacksize;
}sqstack;

typedef struct

...{
int *base;
int *top;
int stacksize;
}sqstackint;


void initstack(sqstack &s)/**//*构造char空栈*/

...{
s.base=(char *)malloc(stack_init_size*sizeof(char));
if(!s.base) printf("申请栈失败!!! ");
s.top=s.base;
s.stacksize=stack_init_size;
}


void initstackint(sqstackint &s) /**//*构造int空栈*/

...{
s.base=(int *)malloc(stack_init_size*sizeof(int));
if(!s.base) printf("申请栈失败!!! ");
s.top=s.base;
s.stacksize=stack_init_size;
}


char gettop(sqstack s) /**//*取char栈顶元素*/

...{
if(s.top==s.base) printf("错误!!! ");
s.top=s.top-1;
return(*(s.top));
}

int gettopint(sqstackint s)/**//*取int栈顶元素*/

...{
if(s.top==s.base) printf("错误!!! ");
s.top=s.top-1;
return(*(s.top));
}


void push(sqstack &s,char e)/**//*将e压入栈*/

...{

if(s.top-s.base>=s.stacksize)...{
s.base=(char *)realloc(s.base,(s.stacksize+increment)*sizeof(char));
if(!s.base) printf("额外申请空间失败!!! ");
s.top=s.base+s.stacksize;
s.stacksize+=increment;
}
*(s.top)=e;
s.top=s.top+1;
}

void pushint(sqstackint &s,int e) /**//*将e压入栈*/

...{

if(s.top-s.base>=s.stacksize)...{
s.base=(int *)realloc(s.base,(s.stacksize+increment)*sizeof(int));
if(!s.base) printf("额外申请空间失败!!! ");
s.top=s.base+s.stacksize;
s.stacksize+=increment;
}
*(s.top)=e;
s.top=s.top+1;
}


void pop(sqstack &s,char &e)/**//*将栈顶元素出栈*/

...{
if(s.top==s.base) printf("错误!!! ");
s.top=s.top-1;
e=*(s.top);
}


void popint(sqstackint &s,int &e)/**//*将栈顶元素出栈*/

...{
if(s.top==s.base) printf("错误!!! ");
s.top=s.top-1;
e=*(s.top);
}


int compare(char c) /**//*比较c是否为数字,是则返回1,否则返回0*/

...{
if((c!='+')&&(c!='-')&&(c!='*')&&(c!='/')&&(c!='(')&&(c!=')')&&(c!='#'))
return 1;
return 0;
}


char precede(char c1,char c2)/**//*比较算符的优先级*/

...{
if(c1=='+')

...{
switch(c2)

...{
case'+':return('>');break;
case'-':return('>');break;
case'*':return('<');break;
case'/':return('<');break;
case'(':return('<');break;
case')':return('>');break;
case'#':return('>');break;
default:printf("比较出错! ");break;
}
}
else if(c1=='-')

...{
switch(c2)

...{
case'+':return('>');break;
case'-':return('>');break;
case'*':return('<');break;
case'/':return('<');break;
case'(':return('<');break;
case')':return('>');break;
case'#':return('>');break;
default:printf("比较出错! ");break;
}
}
else if(c1=='*')

...{
switch(c2)

...{
case'+':return('>');break;
case'-':return('>');break;
case'*':return('>');break;
case'/':return('>');break;
case'(':return('<');break;
case')':return('>');break;
case'#':return('>');break;
default:printf("比较出错! ");break;
}
}
else if(c1=='/')

...{
switch(c2)

...{
case'+':return('>');break;
case'-':return('>');break;
case'*':return('>');break;
case'/':return('>');break;
case'(':return('<');break;
case')':return('>');break;
case'#':return('>');break;
default:printf("比较出错! ");break;
}
}
else if(c1=='(')

...{
switch(c2)

...{
case'+':return('<');break;
case'-':return('<');break;
case'*':return('<');break;
case'/':return('<');break;
case'(':return('<');break;
case')':return('=');break;
default:printf("比较出错! ");break;
}
}
else if(c1==')')

...{
switch(c2)

...{
case'+':return('>');break;
case'-':return('>');break;
case'*':return('>');break;
case'/':return('>');break;
case')':return('>');break;
case'#':return('>');break;
default:printf("比较出错! ");break;
}
}
else if(c1=='#')

...{
switch(c2)

...{
case'+':return('<');break;
case'-':return('<');break;
case'*':return('<');break;
case'/':return('<');break;
case'(':return('<');break;
case'#':return('=');break;
default:printf("比较出错! ");break;
}
}
else return('0');
}

int operate(int c1,char theta,int c2)/**//*进行二元运算*/

...{
if(theta=='+')

...{
return(c1+c2);
}
if(theta=='-')

...{
return(c1-c2);
}
if(theta=='*')

...{
return(c1*c2);
}
if(theta=='/')

...{
return(c1/c2);
}
return(0);
}

/**//*此实验仅能实现[-9~9]之间数据的运算*/
void main()

...{
char c,theta,x;
int m,c1,c2,y;
printf("此程序仅能实现[-9~9]之间数据的运算,#号为结束运算的标志。 ");
printf("请输入计算表达式: ");
sqstack optr;
sqstackint opnd;
initstack(optr);
push(optr,'#');
initstackint(opnd);
while(1)

...{
c=getchar();
while(c!='#'||gettop(optr)!='#')

...{

if(compare(c))...{m=c-'0';pushint(opnd,m);c=getchar();}
else
switch(precede(gettop(optr),c))

...{
case'<':
push(optr,c);c=getchar();break;
case'=':
pop(optr,x);c=getchar();break;
case'>':
pop(optr,theta);popint(opnd,c2);
popint(opnd,c1);
pushint(opnd,operate(c1,theta,c2));break;
}
}
y=gettopint(opnd);
printf("运算结果为:%d ",y);getchar();
}
}