您的位置:首页 > 其它

列队-小型计算器

2013-04-30 15:56 387 查看
题意:对简单的‘+’,‘-’,‘*’,‘/';进行运算,运算的结果保证在长整型范围内。对除以0的输出"impossible".输入的运算操作均合法。

输入的字符串长度小于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  列队 小型计算器