列队-小型计算器
2013-04-30 15:56
387 查看
题意:对简单的‘+’,‘-’,‘*’,‘/';进行运算,运算的结果保证在长整型范围内。对除以0的输出"impossible".输入的运算操作均合法。
输入的字符串长度小于50,数值没有小数出现。
本题的意图很明显,就是依靠列队来或堆栈来实现。规定了一些条件,从而大大地降低了难度。
分析也很容易。比如算:2+3*5-2;对于合法的运算操作,我们可以知道,操作数比操作符多一个,并且是相互交替,奇偶相间。而运算优先级‘*’和‘/‘高一些。在入列的时候
我就直接算出来。也可以全部加进去,在以后出来,方法就是:在遇到’*‘或’/'是要弹出两个操作数(前后)加减不需要。但这样就麻烦些。所有选择在入列的时候就计算出来。从而把乘除都排除了。出来时,可以先进先出(队列),也可以先进后出(堆栈),这源于它们的优先级相同。
代码如下:
输入的字符串长度小于50,数值没有小数出现。
本题的意图很明显,就是依靠列队来或堆栈来实现。规定了一些条件,从而大大地降低了难度。
分析也很容易。比如算:2+3*5-2;对于合法的运算操作,我们可以知道,操作数比操作符多一个,并且是相互交替,奇偶相间。而运算优先级‘*’和‘/‘高一些。在入列的时候
我就直接算出来。也可以全部加进去,在以后出来,方法就是:在遇到’*‘或’/'是要弹出两个操作数(前后)加减不需要。但这样就麻烦些。所有选择在入列的时候就计算出来。从而把乘除都排除了。出来时,可以先进先出(队列),也可以先进后出(堆栈),这源于它们的优先级相同。
代码如下:
#include<cstdio> #include<queue> #include<cstring> using namespace std; typedef long long LL; queue<LL>Q; queue<char>S; bool check(char ch) { if(ch>='0'&&ch<='9') return true; return false; } int main() { char st[55]; while(scanf("%s",st)!=EOF) { int flag=1; while(!Q.empty()) //清除列队 Q.pop(); while(!S.empty()) S.pop(); LL a=0,b=0; int k=strlen(st),i=0; if(check(st[i])) { while(i<k&&check(st[i])) //取出第一数。 { a=a*10+st[i]-'0'; i++; } } while(i<k) { char ch=st[i++]; b=0; while(i<k&&check(st[i])) //取出第二个数。 { b=b*10+st[i]-'0'; i++; } if(ch=='+'||ch=='-') //中间操作数。加减直接入列。 { Q.push(a); S.push(ch); a=b; } else if(ch=='/'){ //乘除,先计算,后入列。 if(b==0){ flag=0; break; } a/=b; } else a*=b; } Q.push(a); //由于,每次取两个操作数且只取一个操作符,而只入列一个数,所以最后一个数还没入列。 if(flag){ a=Q.front();Q.pop(); while(!Q.empty()) { if(S.front()=='+') a+=Q.front(); else a-=Q.front(); Q.pop();S.pop(); } printf("%lld\n",a); } else printf("impossible\n"); } return 0; }
相关文章推荐