中缀表达式求值
来源:互联网 发布:freebsd 源码 编辑:程序博客网 时间:2024/06/11 06:38
- #include <iostream>
- #define MAXSIZE 100 //可以用中缀表达式求值
- using namespace std; //计算整数范围的表达式的值,值的范围不局限于0到79
- typedef struct
- {
- char *base; //栈低指针
- char *top; //栈顶指针
- int stacksize; //栈的大小
- }SqStack;
- void InitStock(SqStack &S) //构造空栈
- {
- S.base=new char[MAXSIZE];
- if(!(S.base))
- cout<<"存储分配失败"<<endl;
- S.top=S.base;
- S.stacksize=MAXSIZE;
- }
- char GetTop(SqStack S) //返回S的栈顶元素
- {
- if((S.top)!=S.base)
- return *(S.top-1);
- return 0;
- }
- void Push(SqStack &S,char e) //插入e为新的栈顶元素
- {
- if((S.top-S.base)==S.stacksize)
- {
- cout<<"栈已满"<<endl;
- }
- else
- {
- *(S.top)=e;
- S.top++;
- }
- }
- void Pop(SqStack &S,char &e) //将栈顶元素弹出
- {
- if(S.top==S.base)
- cout<<"栈空"<<endl;
- else
- {
- e=*(S.top-1);
- S.top--;
- }
- }
- int In(char d)//判断是否为运算符,是则返回1
- {
- switch(d)
- {
- case '(':
- case ')':
- case '+':
- case '-':
- case '*':
- case '/':
- case '=':
- return 1;
- default :
- return 0;
- }
- }
- char Precede(char f,char g) //比较两个运算符的优先级
- {
- if((f=='+'||f=='-')&&(g=='+'||g=='-'))
- return '>';
- if((f=='+'||f=='-')&&(g=='*'||g=='/'))
- return '<';
- if((f=='*'||f=='/')&&(g=='+'||g=='-'))
- return '>';
- if((f=='*'||f=='/')&&(g=='*'||g=='/'))
- return '>';
- if((f=='(')&&(g=='+'||g=='-'||g=='*'||g=='/'))
- return '<';
- if((f=='+'||f=='-'||f=='*'||f=='/')&&(g=='('))
- return '<';
- if((f=='+'||f=='-'||f=='*'||f=='/')&&(g==')'))
- return '>';
- if(f=='=')
- return '<';
- if((f=='+'||f=='-'||f=='*'||f=='/')&&(g=='='))
- return '>';
- if((f=='('&&g==')'))
- return '=';
- return 0;
- }
- int ads(int a,char th,int b)//计算两个数关于算符th的值
- {
- switch(th)
- {
- case '+':
- return a+b;
- break;
- case '-':
- return a-b;
- break;
- case '*':
- return a*b;
- break;
- case '/':
- return a/b;
- }
- return 0;
- }
- int charint(SqStack &OPND,char a)//多个字符数字转换成一个整数
- {
- int *q=new int[MAXSIZE];
- int i,k,g=0;
- for(i=0;i<=MAXSIZE&&GetTop(OPND)!='#';i++)
- {
- Pop(OPND,a);
- q[i]=a-48;
- }
- for(k=i-1;k>=0;k--)
- {
- int er=1;
- for(int z=k;z>0;z--)//计算10的z次方
- er*=10;
- g=g+q[k]*er;
- }
- delete[] q;
- return g;
- }
- void intchar(SqStack &OPND,int j)//将一个整数转换成多个字符
- {
- int i,k;
- char *a=new char[MAXSIZE];
- a[0]=j%10+48; //将整数j的个位数赋给a[0]
- for(i=1;i<MAXSIZE&&j>=10;i++) //将j的其他的位数分别赋给数组a[i];如十位赋给a[1],百位赋给a[2],
- { //依次类推
- j/=10;
- a[i]=j%10+48;
- }
- for(k=i-1;k>=0;k--) //将各个位的字符分别压入栈中
- {
- Push(OPND, a[k] );
- }
- Push(OPND,'#'); //'#'作为整数j的结尾,以便将字符串的j转换成整数
- delete[] a;
- }
- int value(char *Q) //求表达式的值得函数
- {
- char *t=Q;
- SqStack OPND,OPTR; //OPND为操作数栈,OPTR为运算符栈
- InitStock(OPND); //初始化栈
- InitStock(OPTR); //初始化栈
- Push(OPTR,'='); //作为判断开始运算符优先级的比较和读取表达式结束的标志
- Push(OPND,'#'); //作为判断一个整数存储的位置
- while( (*t)!='='||GetTop(OPTR)!='=') //读取表达式结束的条件
- {
- if(!In(*t)) //判断是否压入'#'的条件
- {
- while(!In(*t)) //*t是否为算符,不是则压入操作数栈
- {
- Push(OPND,*t);
- t++;
- }
- Push(OPND,'#');
- }
- switch(Precede(GetTop(OPTR),*t)) //Precede(char ,char)函数是比较两个算符的运算优先级
- {
- case '<':
- Push(OPTR,*t);
- t++;
- break;
- case '>':
- int j,a1,b1;
- char th,a,b;
- Pop(OPTR,th);
- Pop(OPND,b);
- b1=charint(OPND,b);//多位数字字符转为整数
- Pop(OPND,a);
- a1=charint(OPND,a);//多位数字字符转为整数
- if(th=='/'&&b1==0)
- {
- cout<<"除数不能为零!"<<endl;
- return 0;
- }
- else
- {
- j=ads(a1,th,b1);
- intchar(OPND,j);//整数转换成字符
- }
- break;
- case '=' :
- char e;
- Pop(OPTR, e);
- t++;
- break;
- }
- }
- char s;
- Pop(OPND,s);
- cout<<charint(OPND,s)<<endl; //输出计算结果
- delete[] OPND.base;
- delete[] OPTR.base;
- return 0;
- }
- int main()
- {
- cout<<"请输入一个表达式:(如:2*123+56-41+(5*45+96/3-9)*12=)"<<endl;
- char *s=new char[45];
- cin>>s;
- value(s);
- delete s;
- return 0;
- }
阅读全文
1 0
- 中缀表达式求值整数
- 中缀表达式求值
- 中缀表达式直接求值
- 表达式求值(中缀)
- 表达式求值----中缀式
- 中缀表达式求值问题
- Python中缀表达式求值
- 中缀表达式求值
- 中缀表达式求值问题
- 中缀表达式求值
- 中缀表达式求值
- 中缀表达式求值
- DSOJ 中缀表达式求值
- 中缀表达式求值
- 中缀表达式求值
- 中缀表达式求值 C++
- 中缀表达式求值练习
- 中缀表达式求值问题
- 使用多文件编译线性表时出现,LNK2005:int_cdecl int_list(..) 解决办法
- unity3d脚本rederTexture 旋转
- HTTP消息头
- 标识符和关键字
- HTML基础学习
- 中缀表达式求值
- idea创建类,接口等失败遇到的bug
- AngularJS,实现输入框失焦添加内容到最前,当数据重复删除原来并显示在数组最前
- 数据库主从复制
- MySQL备份恢复--Xtrabackup
- 关于pymysql与SQL alchemy连接失败的解决方案
- WKWebView API精讲(OC)
- jsp hibernate技术开发实现电子通讯录后台管理系统
- Linux趣事 -- (2.6)学生信息管理系统(完结)