现在的位置: 首页 > 综合 > 正文

列队-小型计算器

2012年07月03日 ⁄ 综合 ⁄ 共 1180字 ⁄ 字号 评论关闭

题意:对简单的‘+’,‘-’,‘*’,‘/';进行运算,运算的结果保证在长整型范围内。对除以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;
}
				
		 
		
		
		 
			
			
		  
		  

抱歉!评论已关闭.