您的位置:首页 > 理论基础 > 数据结构算法

四则运算

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语言)》中的一段算法描述以作参考:



图1:表达式求值算法



图2:表达式求值算法(续)



图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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构