//本程序接受任意含有+、-、*、/和()的数值表达式,数值允许带小数,输入以#结束。如:((2.4+3.5)*2-(2+3.5)/2)*(2+3)#
#include <stdio.h>
#include "G:\express\mystack.h" char piror[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','f',
'>','>','>','>','f','>','>',
'<','<','<','<','<','f','='};
//保存算符优先矩阵 int chartoint(char ch)//将运算符变成数组(算符优先矩阵)下标
{
switch(ch)
{
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case '#':return 6;
}
} int numchar(char ch)//判断是否为数字符号
{
if (ch>='0' && ch<='9')
return 1;
else return 0;
} int isoptr(char ch)//判断是否为合法的运算符号
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#':return 1;
default :return 0;
}
} float operate(float n1,char ch,float n2)//对操作数按运算符进行运算
{
switch(ch)
{
case '+':return n1+n2;
case '-':return n1-n2;
case '*':return n1*n2;
case '/':return n1/n2;
}
} main()
{
char str[80];
gets(str);
int i=0;
int number1,exp10;
char ch1,ch2,curroptr1;
float number,number2,n1,n2,n3,curroptr,ch3; sqstack optr,opnd;
initstack(optr);push(optr,'#');
initstack(opnd); while(str[i]!='\0')
{
if(numchar(str[i]))
{
number1=0;
while(numchar(str[i]))
{
number1=number1*10+(str[i]-'0');
i++;
}
//已经读取了一个整数 if (str[i]=='.')
{
i++;
number2=0.0;exp10=10;
while(numchar(str[i]))
{
number2=number2+((str[i]-'0')*1.0)/exp10;
exp10=exp10*10;
i++;
printf("number2_____decimal part=%f\n",number2);
}
number=number1+number2;
printf("number_float=%f\n",number);// 将实数压入堆栈
push(opnd,number);
}
else
{
push(opnd,number1);// 将整数压入堆栈
printf("number_____int=%d\n",number1);
}
}
else if(!isoptr(str[i]))
{
printf("express error---1!\n");
exit(0);
}
else
{
ch1=(char)gettop(optr);
ch2=str[i];
printf("ch1=%c,ch2=%c\n",ch1,ch2); if(piror[chartoint(ch1)][chartoint(ch2)]=='>')
{
while(piror[chartoint(ch1)][chartoint(ch2)]=='>')
{
pop(opnd,n2);
pop(opnd,n1);
pop(optr,curroptr);
curroptr1=(char)curroptr;
printf("\n---%f %c %f=====%f\n",n1,curroptr1,n2,operate(n1,curroptr1,n2));
push(opnd,operate(n1,curroptr1,n2));
ch1=(char)gettop(optr);
}
}
if(piror[chartoint(ch1)][chartoint(ch2)]=='<') push(optr,ch2);
if(piror[chartoint(ch1)][chartoint(ch2)]=='=') pop(optr,ch3);
if(piror[chartoint(ch1)][chartoint(ch2)]=='f')
{
printf("express error---2!\n");
exit(0);
}
i++;
}
}
pop(opnd,n3);
printf("\nresult=%f\n",n3);
}

  

#include <stdlib.h>
#include <stdio.h> #define stackinitsize 50
#define stackincrement 8 typedef float elemtype; typedef struct{
elemtype *base;
elemtype *top;
int stacksize;
}sqstack; int initstack(sqstack &s)
{s.base=(elemtype * ) malloc(stackinitsize*sizeof(int));
s.top=s.base;
s.stacksize=stackinitsize;
return 1;
} int push(sqstack &s,elemtype e)
{
*(s.top)=e;
s.top++;
return 1;
} elemtype gettop(sqstack s)
{
return *(s.top-1);
} int emptystack(sqstack s)
{if (s.top==s.base) return 1;
else return 0;
} int pop(sqstack &s,elemtype &e)
{ if (emptystack(s)) return 0;
--s.top;
e=*(s.top);
return 1;
}

  

expresscalculate的更多相关文章

随机推荐

  1. Orchard路由随记(一)

    对于Orchard来说,个人以为要真正理解Orchard,必须理解其路由工作方式. 一.Orchard的自定义路由由三种类型组成 1.分发类: HubRoute:其功能是按租户筛选出当前访问租户的路由 ...

  2. TFS 服务器更换后工作区无法绑定

    需要删除工作区,删除命令如下 tf workspace /delete 工作区名;创建的用户 /server:TFS服务器 例 tf workspace /delete WHQ-PC;whq /ser ...

  3. nginx插件ngx_lua

    ngx_lua是淘宝的维护的产品,真心不错.配置文件包含可以做很多事情的lua脚本. 公司有个产品对注册的广告盒子进行反向代理,这样可以在盒子上做很多事情:和服务器通信,远程控制盒子等等.nginx反 ...

  4. javascript——浅谈javascript模版(自定义)

    /** * Created by Administrator on 15-1-19. */ function functionUtil() { } functionUtil = { //某个DOM节点 ...

  5. extjs下拉框添加复选框

    给ComboBox组件配置listConfig 下拉框代码: var gyslxcm = Ext.create('Ext.form.field.ComboBox',{ id : 'gyslxcm', ...

  6. HTML5拖放API

    拖放事件事件提供了拖放可以控制几乎所有方面的拖放操作.棘手的部分是确定每个事件触发:在拖项目火:别人火下降的目标.拖动项时,以下事件(按照这个顺序): 拖曳开始拖dragend此刻你把鼠标按钮和开始移 ...

  7. js 表达式与运算符 详解(上)

    表达式: 表达式是用于JavaScript脚本运行时进行计算的式子,可以包含常量.变量.运算符 <script> var r = 2 var pi = 3.14 var circle = ...

  8. Iis 日志文件默认路径

    Iis 日志文件默认路径: C:\WINDOWS\system32\LogFiles

  9. 那些年被我坑过的Python——玄而又玄(第六章 面向对象编程基础)

    面向对象编程: 面向对象顾名思义,就是把组织代码的粒度从函数级别抽象到对象级别,对象是通过类来生成的,类可以想象为模板或进本框架而对象是在原有模板或框架的基础上增加详细信息的实体,类,有分类.聚类的含 ...

  10. Python面向对象OOP

    一 OOP     与C++和Java一样,Python同样具有OOP设计. 过程式:从前到后,一条一条,机器能接受的顺序性方式:方式大概为"首先你应该做什么,第二应该做什么,高级点的做点假 ...