UVALive - 4882 Parenthesis 表达式处理、字符串处理、栈


4882 - Parenthesis
Time limit: 3.000 seconds
To a computer, there is no difference between the expression (((x)+(y))(t)) and(x+y)t; but, to a human, the latter is easier to read. When writing automatically generated expressions that a human may have to read, it is useful to minimize the number of parentheses in an expression. We assume expressions consist of only two operations: addition (+) and multiplication (juxtaposition), and these operations act on single lower-case letter variables only. Specifically, here is the grammar for an expressionE:

E : P | P ‘+’ E
P : F | F P
F : V | ‘(’ E ‘)’
V : ‘a’ | ‘b’ | .. | ‘z’
The addition (+, as in x+y) and multiplication (juxtaposition, as inxy) operators are associative: x+(y+z)=(x+y)+z=x+y+z and x(yz)=(xy)z=xyz. Commutativity and distributivity of these operations should not be assumed. Parentheses have the highest precedence, followed by multiplication and then addition.

Input
The input consists of a number of cases. Each case is given by one line that satisfies the grammar above. Each expression is at most 1000 characters long.

Output
For each case, print on one line the same expression with all unnecessary parentheses removed.

Sample input
x
(x+(y+z))
(x+(yz))
(x+y(x+t))
x+y+xt
Sample Output
x
x+y+z
x+yz
x+y(x+t)
x+y+xt

Source
UVALive - 4882
Output
题意:给一个有括号小写字母加号组成的字符串,去掉多余的括号后输出。
code by:xuhuang

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int i,j,s,f,n;
    char a[1010];
    while(~scanf("%s",a))
    {
        n=strlen(a);
        for(i=0; a[i]; i++)
        {
            if(a[i]=='(')
            {
                s=0;
                f=0;
                for(j=i+1; a[j]; j++)
                {
                    if(a[j]==')')
                    {
                        if(s==0)break;//说明找到和a[i]匹配的右括号
                        else s--;
                    }
                    if(s==0&&a[j]=='+')f=1;//说明该括号内是多项式
                    if(a[j]=='(')
                    {
                        s++;
                    }
                }
                if(f==1)
                {
                    if(i>0&&a[i-1]!='+'&&a[i-1]!='(');//并且括号外有多项式和其相乘
                    else if(j<n-1&&a[j+1]!='+'&&a[j+1]!=')');
                    else
                    {
                        for(; a[j]; j++)
                        {
                            a[j]=a[j+1];
                        }
                        for(j=i; a[j]; j++)
                        {
                            a[j]=a[j+1];
                        }
                        n-=2;
                        i--;
                    }
                }
                else
                {
                    for(; a[j]; j++)
                    {
                        a[j]=a[j+1];
                    }//右括号右边的向左移
                    for(j=i; a[j]; j++)
                    {
                        a[j]=a[j+1];
                    }//左括号右边的向左移
                    n-=2;
                    i--;
                }
            }
        }
        printf("%s\n",a);
    }
    return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号