自己写的四则运算,可加括号
2013-01-10 11:22
453 查看
#include<iostream>
#include<vector>
using namespace std;
double getnumber(char*&p)
{
bool falg=true;
double num=0;
double prec=1;//小数点位数
double fnum=0;
if(*p=='-')
{falg=false;//数据为负数
p++;
}
while(*p)
{
if(*p>='0'&&*p<='9')
{num=num*10+*p-'0';p++;}
else
if(*p=='.')
{ p++;
while(*p)
{
if(*p>='0'&&*p<='9')
{
prec=prec*0.1;
fnum+=prec*(*p-'0');
p++;
}
else
break;
}
}
else
break;
}
if(!falg)
return -(num+fnum);
return num+fnum;
}
//这个函数让p指向了下一个
bool Issign(char*&p,double&num)
{
if(*p>='0'&&*p<='9')
{
//利用传入参数返回数据
num=getnumber(p);
return false;//非运算符号
}
else
return true;//返回的p指向当前的运算符号
}
//利用这个计算
double complicate(double a,double b,char*p)
{
switch(*p)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
//利用这个判断两个符号的优先级别
bool chose(char la,char rb)
{
if(la=='*'||la=='/')
return true; //当优先级是左边比较高或者左右相等时,统一先算左边
if(rb=='*'||rb=='/')//右边比较高时先算右边
return false;
return true;
}
//利用上面这个计算,当我们计算条件:遇到‘)’或者p为空且符号数组不为空时
//则调用下面这个函数
//作用,只进行一次括号内运算或者空
void complicateEx(vector<char>&sv,vector<double>&nv)
{
bool falg=true;
char rb;
char*c;
while(sv.size()!=0)
{
rb=sv.back();
sv.pop_back();
if(rb=='(')
return ;
else
{
char p;
/////////////////////////////////////在字符vector中选择合适的符号
if(sv.size()!=0)
{
char la=sv.back();
sv.pop_back();
if(la=='(')//假如存在前一字符,不过为‘(’
{
p=rb;
double b=nv.back();
nv.pop_back();
double a=nv.back();
nv.pop_back();
double num=complicate(a,b,&p);
nv.push_back(num);
return ;
}
else
if(chose(la,rb))//返回真,左边为合适的
{
//nv.push_back()
sv.push_back(rb);//所以押回rb
p=la;
falg=false;//说明要弹出三个
}
else//返回false,右边为合适的,所以押回左边
{ p=rb; sv.push_back(la); }
}
else
p=rb;//假如不存在前一字符
/////////////////////////////////////////////
//存在两个字符情况,假如为la,则要弹出三个,假如是rb或者‘(’则只用弹出两个
double b=nv.back();
nv.pop_back();
double a=nv.back();
nv.pop_back();
double c;
if(!falg)
{
c=nv.back();
nv.pop_back();
//nv.push_back(b);
double mid;
mid=b;
b=a;
a=c;
c=mid;
}
double num=complicate(a,b,&p);
nv.push_back(num);
if(!falg)
{
falg=true;
nv.push_back(c);
}
}
}
}
//封装一个压入函数
void push(char*&p,vector<char>&sv,vector<double>&nv)
{
double num;
while(*p)
{
char pe=*p;
if(*p==')')
{
p++;
return ;
}
else
if(Issign(p,num))
{ sv.push_back(pe); p++; }
else
nv.push_back(num);
}
}
void main()
{
vector<char> sv;
vector<double> nv;
char ch[40];
memset(ch,0,40);
cin.getline(ch,40);
char*p=ch;
while(*p)
{
push(p,sv,nv);
complicateEx(sv,nv);
}
cout<<nv.back();
}
#include<vector>
using namespace std;
double getnumber(char*&p)
{
bool falg=true;
double num=0;
double prec=1;//小数点位数
double fnum=0;
if(*p=='-')
{falg=false;//数据为负数
p++;
}
while(*p)
{
if(*p>='0'&&*p<='9')
{num=num*10+*p-'0';p++;}
else
if(*p=='.')
{ p++;
while(*p)
{
if(*p>='0'&&*p<='9')
{
prec=prec*0.1;
fnum+=prec*(*p-'0');
p++;
}
else
break;
}
}
else
break;
}
if(!falg)
return -(num+fnum);
return num+fnum;
}
//这个函数让p指向了下一个
bool Issign(char*&p,double&num)
{
if(*p>='0'&&*p<='9')
{
//利用传入参数返回数据
num=getnumber(p);
return false;//非运算符号
}
else
return true;//返回的p指向当前的运算符号
}
//利用这个计算
double complicate(double a,double b,char*p)
{
switch(*p)
{
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
//利用这个判断两个符号的优先级别
bool chose(char la,char rb)
{
if(la=='*'||la=='/')
return true; //当优先级是左边比较高或者左右相等时,统一先算左边
if(rb=='*'||rb=='/')//右边比较高时先算右边
return false;
return true;
}
//利用上面这个计算,当我们计算条件:遇到‘)’或者p为空且符号数组不为空时
//则调用下面这个函数
//作用,只进行一次括号内运算或者空
void complicateEx(vector<char>&sv,vector<double>&nv)
{
bool falg=true;
char rb;
char*c;
while(sv.size()!=0)
{
rb=sv.back();
sv.pop_back();
if(rb=='(')
return ;
else
{
char p;
/////////////////////////////////////在字符vector中选择合适的符号
if(sv.size()!=0)
{
char la=sv.back();
sv.pop_back();
if(la=='(')//假如存在前一字符,不过为‘(’
{
p=rb;
double b=nv.back();
nv.pop_back();
double a=nv.back();
nv.pop_back();
double num=complicate(a,b,&p);
nv.push_back(num);
return ;
}
else
if(chose(la,rb))//返回真,左边为合适的
{
//nv.push_back()
sv.push_back(rb);//所以押回rb
p=la;
falg=false;//说明要弹出三个
}
else//返回false,右边为合适的,所以押回左边
{ p=rb; sv.push_back(la); }
}
else
p=rb;//假如不存在前一字符
/////////////////////////////////////////////
//存在两个字符情况,假如为la,则要弹出三个,假如是rb或者‘(’则只用弹出两个
double b=nv.back();
nv.pop_back();
double a=nv.back();
nv.pop_back();
double c;
if(!falg)
{
c=nv.back();
nv.pop_back();
//nv.push_back(b);
double mid;
mid=b;
b=a;
a=c;
c=mid;
}
double num=complicate(a,b,&p);
nv.push_back(num);
if(!falg)
{
falg=true;
nv.push_back(c);
}
}
}
}
//封装一个压入函数
void push(char*&p,vector<char>&sv,vector<double>&nv)
{
double num;
while(*p)
{
char pe=*p;
if(*p==')')
{
p++;
return ;
}
else
if(Issign(p,num))
{ sv.push_back(pe); p++; }
else
nv.push_back(num);
}
}
void main()
{
vector<char> sv;
vector<double> nv;
char ch[40];
memset(ch,0,40);
cin.getline(ch,40);
char*p=ch;
while(*p)
{
push(p,sv,nv);
complicateEx(sv,nv);
}
cout<<nv.back();
}
相关文章推荐
- 一个非常酷的Js计算器(加减乘除,浮点,以及括号运算,四则混合运算)
- 带括号的四则运算 汇编
- 计算带括号的四则运算表达式,这个实现方式你想过吗?
- 表达式计算 四则运算(有括号)的计算
- QT,计算器实现(四则运算,括号,小数,负数)---(一)
- 面试题 简单的字符串表达式四则运算(不考虑括号)
- 栈的应用,实现简单的不带括号的四则运算
- 带括号的四则优先级运算的算法详细源码实现
- 带括号的四则运算表达式的求值(栈实现)
- 发一个自己写的四则运算实现
- 带括号的四则混合运算的算符优先算法java实现
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
- 0-9 带括号的四则运算
- 四则运算表达式树 C++模板 支持括号和未知数
- 四则运算问题扩充:1、题目避免重复;2、可定制(数量/打印方式);3、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除法有无余数、否支持分数 (真分数, 假分数, …)、是否支持小数 (精确到多少位)、打印中每行的间隔可调整;
- 计算表达式的值(仅含有四则运算和支持括号嵌套,浮点数运算)
- C/C++带括号的四则运算
- 计算中缀表达式(实数,四则运算与括号)(双栈)
- 含括号的四则运算
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)