SPOJ Problem 4:Transform the Expression

这题也不难,模拟一下栈,若搜到字符为+-则弹出栈顶,若搜到字符为*/且不为+-则弹出栈顶,然后把搜到的操作字符压入栈顶,字母就输出。

#include<cstdio>
#include<cstring>
char s[500],symbol[500];
int num[500],i,j,t,r;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%s",s);
        memset(symbol,0,sizeof(symbol));
        memset(num,0,sizeof(num));
        r=0;i=0;j=0;
        while(i<strlen(s)){
            if (s[i]==‘(‘){
                r++;
            }else
            if (s[i]>96&&s[i]<123)
                putchar(s[i]);
            else
            if (s[i]==‘)‘){
                putchar(symbol[j]);
                j--;
            }else
            if (s[i]==‘+‘||s[i]==‘-‘){
                if (j!=0&&r==num[j]){
                    putchar(symbol[j]);
                    j--;
                }
                symbol[++j]=s[i];
            }else
            if(s[i]==‘*‘||s[i]==‘/‘){
                if (j!=0&&r==num[j]&&symbol[j]!=‘+‘&&symbol[j]!=‘-‘){
                putchar(symbol[j]);
                    j--;
                }
                symbol[++j]=s[i];
            }else
            if (s[i]==‘^‘){
                symbol[++j]=s[i];
            }
            i++;
        }
        printf("\n");
    }
}
时间: 2024-10-13 12:21:42

SPOJ Problem 4:Transform the Expression的相关文章

codechef Transform the Expression 转换成逆波兰式

把一般式子转换成逆波兰式. 这里的都是加括号的,难度降低点. Example Input: 3 (a+(b*c)) ((a+b)*(z+x)) ((a+t)*((b+(a+c))^(c+d))) Output: abc*+ ab+zx+* at+bac++cd+^* 知道其特点就好办: 1 遇到字母一定是可以输出的 2 遇到操作符号就入栈 3 遇到括号')',就出栈一个操作符 - 注意不是所有操作符出栈 不带括号的操作区别就在于是否需要判断符号的优先级. #include <stack> #i

素数筛法--SPOJ Problem 2 Prime Generator

质数(prime number)又称素数,除了1和它本身外,不能整除以其他自然数,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.最小的质数是2. 要判断一个整数N是不是质数很简单,看它是否能被2到sqrt(N)之间的整数整除即可. def isPrime(n): if n%2==0: return False for i in xrange(3,int(math.sqrt(n)+1),2): if n%i==0: return False return True 不过要找出1

SPOJ Problem 7974:What&#39;s Next

求数列下一项,啥都不说了,贡献了N多WA... #include<cstdio> int main(){ int a,b,c; while(scanf("%d%d%d",&a,&b,&c)&&(a||b||c)){ if (b*2==c+a&&b!=a) printf("AP %d\n",2*c-b); else printf("GP %d\n",c*c/b); } return

SPOJ Problem 2: Prime Generator

嗯..在SPOJ上刷的第二题. 一开始不知道哪错了,后来发现i出现了两遍.. 因为m<10^9,所以用素数筛筛32000以内的数,开一个4000的数组存储就行.然后再从n开始用素数筛,总之效率还行. 代码如下: //0.01s 3.2M #include<cstdio> #include<cstring> #include<cmath> int n,i,j,t,m,k,tot; int a[100005],b[4000]; int prime[40000]; in

SPOJ Problem 9948:Will it ever stop

如题..http://www.spoj.com/problems/WILLITST/ #include<cstdio> long long n; int main(){ scanf("%lld",&n); while(n>1){ if (n==3||n==6){printf("NIE\n");return 0;} if (n&1)n=(n+1)/2*3;else n>>=1; } printf("TAK\n&q

SPOJ Problem 302:Count on Cantor

题目不复述了,自己看吧.http://www.spoj.com/problems/CANTON/一如既往的暴力.. #include<cstdio> int n,i,j,s,ans; int main(){ scanf("%d",&n); while(n--){ scanf("%d",&s); printf("TERM %d IS ",s); for (i=1;s>i;i++){ s-=i; } if (i&am

SPOJ Problem:A Game with Numbers

突然就看到SPOJ升级了,让我好不适应.. 这一一道博弈论的题目,可以先前面暴力一下,易得小于十的为必胜态,十的时候必败,然后11到19又必胜,而且发现只要各位为零且这个数不为零就必败. 再依次验证上百,上千的数.. #include<cstdio> #include<cstring> int n; int main(){ scanf("%d",&n); if (n%10==0&&n!=0)printf("2\n");

SPOJ Problem 379:Ambiguous Permutations

http://www.spoj.com/problems/PERMUT2/ 如题.. #include<cstdio> #include<cstring> int n,i,j; int a[100005]; int main(){ while(scanf("%d",&n)&&n){ for (i=1;i<=n;i++){ scanf("%d",&a[i]); } for (i=1;i<=n;i++)

SPOJ Problem 2727:Army Strength

题目在此  http://www.spoj.com/problems/ARMY/ 总体来说就是求最大值.. #include<cstdio> #include<cstring> int x,n,t,i,a,b; int max,pos; int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&a,&b); max=0; for (i=1;i<=a;i++){ s