★ 输入文件:calc.in 输出文件:calc.out
时间限制:1 s 内存限制:256 MB 测试点数:5
【题目描述】
小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“”,“/”,“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)
【输入格式】
共1行,为一个算式。
【输出格式】
共1行,算式的答案,即密码。
【样例输入】
(3+4)(6-2)/(20-6)
【样例输出】
2
【提示】
100%的数据满足:算式长度<=30 其中所有数据在2^31-1的范围内,所有的算式均合法正确。
先上代码
#include<bits/stdc++.h>
using namespace std;
char compare1(char x,char y)//比较(但代码冗杂)
{
if((x=='+'||x=='-'))
{
if(y=='+'||y=='-'||y==')'||y=='\n')
return '>';
else
return '<';
}
else if(x=='*'||x=='/')
{
if(y=='('||y=='^')
return '<';
else
return '>';
}
else if(x=='^')
{
if(y=='(')
return '<';
else
return '>';
}
else if(x=='\n')
{
if(y=='\n')
return '=';
else
return '<';
}
else if(x=='(')
{
if(y==')')
return '=';
else
return '<';
}
else
return '>';
}
int pow1(int a,int b)
{
int s=1;
for(int i=0;i<b;i++)
s=s*a;
return s;
}
int operat(int a,int b,char c)//运算,个人感觉这里不能缩减了
{
if(c=='*')
return a*b;
else if(c=='+')
return a+b;
else if(c=='-')
return b-a;
else if(c=='/')
return b/a;
else
return pow1(b,a);
}
int check1(char x)//(查)
{
if(x<='9'&&x>='0')
return 1;//是操作数
else
return 0;//是操作符
}
int sum1(char a[],int i)//将字符数组a[]转变为值
{
int s=0,q=1;
for(int j=0;j<i;j++)
{
q=1;
for(int k=0;k<i-1;k++)
q=q*10;
s=s+(a[j]-'0')*q;
}
return s;
}
int main()
{
stack<int> s1;
stack<char> s2;
char c,x[100];
int a,b,i=0;
s2.push('\n');
c=getchar();
while(s2.top()!='\n'||c!='\n')//设置弹出条件
{
if(check1(c))//判断是否为操作数
{
x[i]=c;i++;
c=getchar();
if(!check1(c))
{
a=sum1(x,i),i=0;
s1.push(a);
}
}
else
switch(compare1(s2.top(),c))//核心代码,关于对栈的操作;
{
case '<':s2.push(c),c=getchar();break;
case '=':s2.pop(),c=getchar();break;
case '>':
a=s1.top(),s1.pop(),b=s1.top(),s1.pop();
s1.push(operat(a,b,s2.top()));
s2.pop();
}
}
cout<<s1.top();
return 0;
}
代码约100行左右(主要是个人习惯不好,但自己看着舒服)
解释直接看注释吧.
收获:
对栈的运用与理解更加熟悉;
想题目时(实际操作时),一定要问自己:自己需要解决什么问题?如何解决?
方法很多,有时候粗暴反而更加简单;