表达式四则运算。
2008-05-03 12:32
483 查看
实现方法一:用递归来实现。
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();
}
}
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();
}
}
相关文章推荐
- 在Java中计算四则运算表达式字符串的值
- 栈的应用--四则运算表达式求值(java代码)
- 面试题(十五)四则运算表达式
- 四则运算表达式求值(栈的应用)
- 四则运算表达式求值
- 表达式(四则运算)计算的算法
- 输入四则运算的表达式,求解结果算法
- 7.栈的应用-四则运算算术表达式求解(算符优先法)
- java 四则运算,并可完成 自定义函数 表达式 功能
- 栈的应用——四则运算表达式
- 基于c语言的数据结构之栈应用(二)四则运算表达式的应用
- 四则运算-逆波兰表达式
- 第五次作业——计算器(增加一种读取四则运算表达式的方式)
- 栈的测试--四则运算表达式求值(C语言)
- 栈的应用——四则运算表达式(逆波兰算法)
- 四则运算表达式 逆波兰表达式
- 后缀表达式+栈的应用=四则表达式运算
- 分析四则运算表达式结构的小程序
- 四则运算表达式求值
- 四则运算表达式网页版