自己写的四则运算,可加括号
来源:互联网 发布:淘宝类似的购物网站 编辑:程序博客网 时间:2024/05/01 01:05
#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();
}
- 自己写的四则运算,可加括号
- 用C#写的四则运算类(包括括号运算)
- 含括号的四则运算
- 带括号的四则运算
- 用单片机加LCD写的混合四则运算计算器
- 自己写的括号匹配算法
- 自己写的一个复数四则运算的一个类
- 带括号的四则运算 汇编
- 自己写得C++简单的四则运算小程序
- 科学计算器(可实现带括号的浮点数四则运算)
- java写的四则运算
- C++简单计算器实现(四则运算加括号)
- 自己写的一个括号匹配的程序
- 0-9 带括号的四则运算
- 不带括号的四则运算步骤
- java 实现带括号的加减乘除四则运算
- 计算带括号的四则运算表达式
- 不带括号的简单四则运算
- X86单网卡Desktop源码安装Openstack 组件之Keystone、Glance、Nova
- 逻辑卷管理
- HBase之二【HBase基础】hbase介绍(2)
- MySql 索引 详解
- 什么是数据结构
- 自己写的四则运算,可加括号
- Android中Service类onStartCommand的返回值
- XCode的构造iOS应用程序是如何启动的
- 硬盘安装 redhat enterprice 6.1 失败实例1
- 再续抓数据经验谈--找到数据来源的方法
- eclipse的Alt+/不能用解决方法,增强Eclipse智能感知 eclipse key assist
- lua 读取网页 luacurl
- 移动技术加速企业效率
- 自定义Adapter