Nyoj 467【接尾辞】

2860 ワード

/*       
    :1000 ms  |      :65535 KB
  :3
  
                   ,        “   ”   ,                                 
   ,      ,                。
  
         n,  n     (n<10)。
          ,        1000    ,           ,        “=”  。         +-*/   /*      
   。           。                 。
         0
  
                ,                。
    
2
1.000+2/4=
((1+2)*5+1)/4=
    
1.000 2 4 / + =
1 2 + 5 * 1 + 4 / =
  
    */
#include<stdio.h>
#include<string.h> 
char out[1010], stack[1010], s[1010];
int l1, l2;
int main()
{
	int i, j, k, m, n;
	scanf("%d", &n);
	getchar();
	while(n--)
	{
		gets(s); 
		m = strlen(s);
		l1 = k = l2 = 0;
		for(i = 0; i < m-1; i++)
		{
			if(s[i] >= 48 && s[i] <= 57 || s[i] == '.')
			{
				if(k)
				{
					out[l2++] = ' ';
					k = 0;
				} 
				out[l2++] = s[i];
			}
			else if(s[i] == '-' || s[i] == '+')
			{
				for(j = l1-1;j >= 0; j--)
				{
					if(stack[j] != '(')
					{out[l2++] = ' ';
						out[l2++] = stack[j];
						
						l1--;
					}
					else 
					{
						break;
					}
				}
				stack[l1++] = s[i];
				k =1;
			}
			else if(s[i] == '*' || s[i] == '/')
			{
				for(j = l1-1; j >= 0; j--)
				{
					if(stack[j] == '*' || stack[j] == '/')
					{
						out[l2++] = ' ';
						out[l2++] = stack[j];
						l1--;
					}
					else
					break;
				}
				stack[l1++] = s[i];
				k = 1;
			}
			else if(s[i] == '(')
			{
				stack[l1++] = s[i];
				k = 1;
			}
			else  if(s[i] == ')')
			{
				for(j = l1-1; j >= 0; j--)
				{
					if(stack[j] != '(')
					{
						out[l2++] = ' ';
						out[l2++] = stack[j];
						
						l1--;
					}
					else 
					{
						l1--;
						break;
					}
				}
			}
			
		}
		while(l1)
			{out[l2++] = ' ';
				out[l2++] = stack[l1-1];
				
				l1--;
			} 
			out[l2] = '\0';
		for(i  = 0; i < l2 ; i++)
		{
			if(out[i] != ' ')
			{
				for(j = i; j < l2; j++)
				{
					printf("%c", out[j]);
				}
				printf(" =
"); break; } } } return 0; }

ここで扱いにくいのは出力時のスペースです