计算(calc.cpp)

计算(calc.cpp)

【问题描述】

小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

【输入】

输入文件calc.in共1行,为一个算式。

【输出】

输出文件calc.out共1行,就是密码。

【输入样例】calc.in

1+(3+2)*(7^2+6*9)/(2)

【输出样例】calc.out

258

【限制】

100%的数据满足:算式长度<=30 其中所有数据在231-1的范围内。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<string>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int  number[101],i=0, p=1;
 8 char symbol[101],s[256],t[256];  
 9 //p:指向当前的运算符,同时指向当前运算符所对应的操作数 
10 void push()      //算符入栈运算
11 {
12   symbol[++p]=s[i];
13 }
14 void pop()       //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
15 {
16    switch (symbol[p--])//运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成 
17    {
18       case '+':
19       {
20           number[p]+=number[p + 1];
21           break; 
22       }
23       case '-':
24       {
25           number[p]-=number[p + 1];
26           break;    
27       }
28          case '*':
29       {
30           number[p]*=number[p + 1];
31          break;
32         }
33       case '/':
34       {
35           number[p]/=number[p + 1];
36           break;
37       }
38       case '^':
39       {
40         number[p]=pow(number[p],number[p + 1]);
41       }
42    }
43 }
44 bool can()            //判断运算符的优先级别,建立标志函数,能否进行运算 
45 {
46   if ((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') //在括号之内 
47   return 1;
48   if ((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/'))
49   //若遇到乘除且p对应的恰好是乘除 
50   return 1;
51   return 0;
52 }
53 main()
54 {  
55   printf("String :");gets(s);
56   s[strlen(s)]=')';
57   symbol[p]='(';
58   while (i<strlen(s))      
59 {
60       while (s[i]=='(')            //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!='(') 
61       {
62           push();
63           i++;
64       }
65       int x=0;
66       while (s[i]>='0'&&s[i]<='9')  //取数入操作数栈
67          x=x*10+s[i++]-'0';
68       number[p]=x;
69       do
70       {  
71           if (s[i]==')')            //当右括号后面还有右括号时处理
72           {
73             while (symbol[p]!='(') 
74             pop();//当括号内还有算式没有算完时进行运算 
75             number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果 
76           }
77           else
78           {                   //根据标志函数值作运算符入栈或出栈运算处理
79             while (can()) 
80             pop();// 当可以进行运算时运算,然后压入一个运算符 
81             push();
82           }
83         i++;
84       }while (i<strlen(s)&&s[i-1]==')');//当检测到右括号时,可以运算括号内的内容 
85   }
86   printf("Result=%d", number[0]);//因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内 
87   return 0;
88 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

窥探Swift之需要注意的基本运算符和高级运算符

  之前更新了一段时间有关Swift语言的博客,连续更新了有6、7篇的样子。期间间更新了一些iOS开发中SQLite、CollectionViewControl...

20650
来自专栏ShaoYL

OC语言Block 续

340120
来自专栏编程

宝宝都能学会的python编程教程4:关系运算符与循环

关系运算符 if 语句 实际应用中的程序,大多不是一撮而就的,而是根据条件不同存在很多分支。 最基本的条件分支结构是if...else...语句即如果。。。否则...

22590
来自专栏我爱编程

Day18内建模块collections&base64collectionsbase64

collections collections是Python内建的一个集合模块,提供了许多有用的集合类。 namedtuple >>> from collect...

43480
来自专栏老司机的技术博客

人人都能学会的python编程教程4:关系运算符与循环

在python当中,if condition1:(注意最后的冒号:)称为“语句头”。冒号:之后另起一行缩进的是“语句体”,语句体的行数不限,但至少有一行,否则需...

34990
来自专栏iOSer成长记录

iOS-Strong/Copy修饰词

11630
来自专栏老马说编程

(92) 函数式数据处理 (上) / 计算机程序的思维逻辑

上节我们介绍了Lambda表达式和函数式接口,本节探讨它们的应用,函数式数据处理,针对常见的集合数据处理,Java 8引入了一套新的类库,位于包java.uti...

19960
来自专栏偏前端工程师的驿站

Java魔法堂:深入正则表达式API

目录                               一、前言 二、正则表达式的使用诉求 三、java.util.regex包 四、java.lan...

21950
来自专栏calmound

sprintf的用法

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者...

37360
来自专栏Web 开发

JavaScript的对象引用

在一个函数体内,var变量声明的变量,其作用域只在该函数体内,对于函数体外而言,是不可见的(废话)。

9400

扫码关注云+社区

领取腾讯云代金券