四则运算
2016-04-14 23:21
453 查看
问题 I 算法3-4:表达式求值
时间限制: 1 Sec 内存限制: 128 MB[提交]
题目描述
算数四则运算的规则是1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。 由此,算式4+2*3-10/5的计算顺序为4+2*3-10/5=4+6-10/5=4+6-2=8。 给定一个以“#”作为结束符的算式,求出算式的结果。 给出严蔚敏《数据结构(C语言)》中的一段算法描述以作参考:![](http://coder.buct.edu.cn:8088/JudgeOnline/upload/201404/pimg1473_1.jpg)
图1:表达式求值算法
![](http://coder.buct.edu.cn:8088/JudgeOnline/upload/201404/pimg1473_2.jpg)
图2:表达式求值算法(续)
![](http://coder.buct.edu.cn:8088/JudgeOnline/upload/201404/pimg1473_3.jpg)
图3:表达式求值算法(续
输入
以“#”结尾的表达式,运算数为正整数。每个表达式占一行。
输出
输出表达式运算的结果。
样例输入
4+2*3-10/5#3*(7-2)#2*3/2#
样例输出
8153#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> #include<math.h> int a[100001];//存储符号 char b[100001];//存储数字 char c[100001];//中转栈 int topc=-1; int topab=-1; int ji[10001]; topj=-1; int main(){ char s[100001]; int num=0; int flag=0; while(~scanf("%s",&s)){ int len=strlen(s); len--; int i,j; for(i=0;i<len;i++) a[i]=9999; //for(i=0;i<10;i++) //printf("%d\n",a[i]); i=0; while(i<len){ if(isdigit(s[i])==1){ while(isdigit(s[i])==1){ num*=10; num+=s[i]-48; i++; } topab++; a[topab]=num; num=0; } else if(s[i]=='('){ topc++; c[topc]=s[i]; i++; } else if(s[i]==')'){ while(c[topc]!='('){ topab++; b[topab]=c[topc];//printf("%c\n",b[topab]); topc--; } topc--; i++; } else{ if(s[i]=='-'){ if(i==0){ i++; num=0; while(isdigit(s[i])==1){ num*=10; num+=s[i]-48; i++; } topab++; a[topab]=0-num; num=0; } else{ if(s[i-1]=='('){ 4000 i++; num=0; while(isdigit(s[i])==1){ num*=10; num+=s[i]-48; i++; } topab++; a[topab]=0-num; num=0; } else{ while(c[topc]!='('&&topc>=0){ topab++; b[topab]=c[topc];//printf("%c\n",b[topab]); topc--; if(topc==-1) break; } topc++; c[topc]=s[i]; i++; } } } else if(s[i]=='+'){ while(c[topc]!='('&&topc>=0){ topab++; b[topab]=c[topc];//printf("%c\n",b[topab]); topc--; if(topc==-1) break; } topc++; c[topc]=s[i]; i++; } else if(s[i]=='*'||s[i]=='/'){ while((c[topc]=='*'||c[topc]=='/')&&topc>=0){ topab++; b[topab]=c[topc];//printf("%c\n",b[topab]); topc--; if(topc==-1) break; } topc++; c[topc]=s[i]; i++; } } } while(topc>=0){ topab++; b[topab]=c[topc];//printf("%c\n",b[topab]); topc--; } /*for(i=0;i<=topab;i++){ if(a[i]!=9999) printf("%d\n",a[i]); else printf("%c\n",b[i]); }*/ for(i=0;i<=topab;i++){ if(a[i]!=9999){ topj++; ji[topj]=a[i]; } else{ switch(b[i]){ case '+':ji[topj-1]=ji[topj-1]+ji[topj];topj--;break; case '-':ji[topj-1]=ji[topj-1]-ji[topj];topj--;break; case '*':ji[topj-1]=ji[topj-1]*ji[topj];topj--;break; case '/':if(ji[topj]!=0){ ji[topj-1]=ji[topj-1]/ji[topj]; topj--; } else{ flag=1; } break; default:break; } } } if(!flag){ printf("%d\n",ji[0]); } flag=0; topab=-1; topj=-1; } return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)