2014-11-25 回答

#include

#include

#define n 100

typedef struct{   //操作数栈

float d[n];

int len;     //len相当于top

}stacks,*lists;

typedef struct{  //运算符栈

char c[n];

int len;    //len相当于top

}stack,*list;

int init(list p);   //stack 初始化

int inits(lists p);    //stacks 初始化

int pushs(lists p,float m);   // stacks 入栈

int push(list p,char c);   //stack 入栈

int pops(lists p,float *m);  //stacks 出栈

int pop(list p,char *c);  //stack  出栈

int in(char c);  //判断c是否为数据 是则返回 1 否则 返回 0

char pre(char s,char c);  //判断s c的优先级 s>c return '>'; s

float operate(float a,char t,float b); //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b

float value(char s[]);  //求表达式s 的值

void main(){

char s[n];  int n; float f;

printf("*******************express evaluate***********************\n");

while(1){

printf("please input a express\n");

scanf("%s",s);    //输入表达式

n=strlen(s);    //求表达式的长度

printf("express length=%d\n",n); //输出表达式的长度

s[n]='#';    //在表达式尾部插入'#' 注: # 表示操作结束

f=value(s);   //计算表达式的长度

printf("f=%.5f\n",f);  //输出表达时的值 注 只输出前五位小数

printf("continue input 1,break input 0\n");

scanf("%d",&n); printf("\n");     //判断是否继续进操作  是则输入 1,否则输入 0

if(!n) break;  }

}

int init(list p){

if(!p) {printf("error,init stack null\n"); return 0;}

p->len=0;

return 1;

}

int inits(lists p){

if(!p) {printf("error,init stacks null\n"); return 0;}

p->len=0;

return 1;

}

int pushs(lists p,float m){

if(!p) {printf("error,pushs stacks null\n"); return 0;}

p->d[p->len++]=m; return 1;

}

int push(list p,char c){

if(!p) {printf("error,push stack null\n"); return 0;}

p->c[p->len++]=c; return 1;

}

int pops(lists p,float *m){

if(!p) {printf("error,push stacks null\n"); return 0;}

*m=p->d[--p->len]; return 1;

}

int pop(list p,char *c){

if(!p) {printf("error,push stack null\n"); return 0;}

*c=p->c[--p->len]; return 1;

}

int in(char c){  //判断c是否为数据 是则返回 1 否则 返回 0

if(c>='0'&&c<='9'||c=='.') return 1; return 0;}

char pre(char s,char c){  //判断s c的优先级 s>c return '>'; s

char m= '' , r;

if((s=='-')||(s=='+')){

if((c=='*')||(c=='(')||(c=='/'))

r=m;

else r=k; }

if((s=='*')||(s=='/')){

if((c=='(')) r=m;

else r=k;  }

if(s=='('){

if(c==')') r=n;

else r=m;  }

if(s==')')

r=k;

if(s=='#') {

if(c=='#') r=n;

else r=m;  }

return r;

}

float operate(float a,char t,float b){   //对a b进行t(+-*/)运算 return a+b or a-b, a*b ,a/b

if(t=='-') return a-b;  if(t=='+') return a+b;

if(t=='*') return a*b;  if(t=='/') return a/b; }

float value(char s[]){

stacks opnd;  stack optr;  char *p,*pr,x,t; float a,b,m=0;

inits(&opnd); init(&optr);  int k=0,i,tp=10;

push(&optr,'#');  //将'#'压入栈optr中,作结束标志

p=pr=s;   //初始化 指针 p pr 使pr p 指向 表达式

while(*p!='#'||optr.c[optr.len-1]!='#'){//当p指向的操作符 和optr 中的栈顶元素都为'#'时 操作结束

if(in(*p))  //如果p指向数字 则把 数字字符串转化为实型(float)数据 并存入栈opnd中

{

m=0; k=0;  tp=10;

while(in(*p)) p++;  //使p指向下一个运算符

while(pr!=p)

{

if(*pr!='.')   //如果pr指向小数点 则跳过

m=(m+*(pr++)-'0')*10;  //将单个字数字符转化为数据 并逐位求和

else{                   //如 12.3 -> 1230

k=p-pr; pr++; }

}

for(i=0,tp=10;i

{

tp=tp*10;

if(i==k-1)

tp=tp/10;

}

pushs(&opnd,m/tp); //输入栈opnd中

}

else switch(pre(optr.c[optr.len-1],*p)){

case'

case'=':pop(&optr,&x);p++;pr=p;break;

case'>':pop(&optr,&t);  pops(&opnd,&b);  pops(&opnd,&a);  //输出一个操作符和两个数据

pushs(&opnd,operate(a,t,b));break;} //运算

}

return opnd.d[opnd.len-1]; //返回表达式的值

}

c语言数组中元素的加减乘除,c语言中,取余运算符和加减乘除的运算顺序??...相关推荐

  1. c语言横坐标加一怎么表示,c语言中‘取反加一’是怎么回事啊?

    c语言中'取反加一'是怎么回事啊?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中'取反加一'是怎么回事啊? 计 ...

  2. c语言数组前const的作用,c语言中const的用法

    C语言作为一门新型高级编程语言,在计算机软件编程中具有较为广泛的应用和实现.下面小编就跟你们详细介绍下c语言中const的用法,希望对你们有用. c语言中const的用法如下: const的基本解释 ...

  3. C语言switch中break的作用,C语言中switch...case语句中break的重要性

    在C语言中switch...case语句是经常用到的,下面我介绍一下在使用该语句时候需要注意的一个细节问题.话不多说,直接举例子: 例子1: switch(fruit) { case 1:printf ...

  4. c语言数组数据的输入,在C语言中,数组中的值如何输入到函数中?

    我希望这有帮助: #include /* don't need to specify size of array1 here */ /* rather pass the no. of elements ...

  5. C语言程序中的精度问题,c语言中float精度问题

    3.1415926(10进制) == 11.00100100001111110110100110100010010110110000100101(2进制) == 1.10010010000111111 ...

  6. C语言数组中找到第一个重复元素的算法(附完整源码)

    C语言数组中找到第一个重复元素的算法 C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) C语言数组中找到第一个重复元素的算法完整源码(定义,实现,main函数测试) #in ...

  7. C++与C语言中有关数组中元素排序

    C++与C语言中有关数组中元素排序 C语言中 ​ #include<stdio.h> #define n 4 int main(){ int a[n]; int i,j,temp; for ...

  8. 一维数组元素倒置 c语言,实例12 数组中元素的倒置.pdf

    第1 篇 C 语言基础知识 第1 章 走入C 语言的世界 实例12 数组中元素的倒置 [实例描述] 让一维数组中的元素转置,也就是让数组的元素本末倒置,即第 一个元素变成最后一个元素,第二个元素变成倒 ...

  9. (c语言)编程输出二维数组中元素的最大值,要求用指针实现。

    (c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...

最新文章

  1. R语言普通最小二乘回归分析
  2. CodeChef TWOROADS(计算几何+拉格朗日乘数法)
  3. 搜索引擎平台化的构想
  4. 基于Spring的Web缓存
  5. 百度金融资深产品经理降峰:互金产品如何准确触达用户
  6. VS 配置外部DLL的引用路径【可执行文件的环境路径】
  7. php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例
  8. zstack 第一个例子
  9. LoadRunner场景设置里的各参数解释
  10. 返回一个一维整数数组中最大子数组的和
  11. C/C++[codeup 1934,1932,1935]查找
  12. 布谷鸟过滤器java使用_一种基于布谷鸟过滤器的云平台隐私保护方法与流程
  13. 电脑证书错误即上网站打不开提示证书错误
  14. SD卡格式化|SD卡数据恢复技巧
  15. 乌镇互联网大会:大佬们都爱AI
  16. Windows主机间批量操作的基本配置
  17. 测试集和训练集8:2切分
  18. linaro gcc 交叉编译链编译
  19. html语言设置网页名称,HTML语言范例
  20. h5页面自适应手机屏幕宽度

热门文章

  1. 幸福指数与GDP线性拟合
  2. 在jupyter中使用pypy
  3. Vigenere算法如何进行加密操作?
  4. CC2530+CC259x ZStack-2.5.1a 功率放大应用
  5. 铠装计算机电缆型号,铠装计算机电缆 DJYVP22 7*2*1.0 安徽省品牌
  6. 视频教程-CCNP 思科认证网络工程师(美女讲师版)-思科认证
  7. linux 网络命令 mii-tool 和 ethtool 使用
  8. 2008年的一个严肃的笑话
  9. 了解CPU盒装与散装的区别
  10. git的环境配置与从cmd下载文件