0

这是反向波兰符号的代码。当我在 unix 上运行它时,它工作正常,但 codechef 说错误的答案。请帮忙。

#include<stdio.h>
#include<string.h>

void push(char);
void pop();

char stack[400];
unsigned long top=0;

int main()
{
    unsigned long len, test_case,i=0,j=0;
    char expr[400];

    scanf("%u\n",&test_case);

    for(;j<test_case;j++)
    {
        scanf("%s\n",expr);
        len=strlen(expr);

        for(;i<len;i++)
        {
            if(expr[i]=='+'||expr[i]=='-'||expr[i]=='*'||expr[i]=='/'||expr[i]=='^')
                push(expr[i]);

            else if(expr[i]==')')
            {
                pop();
            }

            else if(expr[i]=='(')
                continue;

            else
                printf("%c",expr[i]);
        }
    }

    return 0;
}

void pop()
{
    if(top==-1)
        return;
    else
    {
        printf("%c",stack[top]);
        top=top-1; 
    }
}

void push(char x)
{
    if(top==400)
        return;
    else
    {
        stack[++top]=x;
    }
}
4

5 回答 5

2

更改此行

 for(;i<len;i++)

for(i=0;i<len;i++)

然后它会正常工作。在 codechef 中有很多测试用例,所以在你的程序中,它对于第一个测试用例可以正常工作,但在那之后它会失败,因为第二个测试用例中的 'i' 的值将从它在第一个用例结束的地方开始。因此,您必须在每个测试用例中初始化 i 的值。

于 2014-05-07T07:55:19.373 回答
1

我经历了同样的情况,这是我解决这个问题的方法:

#include<stdio.h>
#include<string.h>

char stack[400];
unsigned long top = 0;

void pop() {
    if (top == -1) {
        return;
    } else {
        printf("%c",stack[top]);
        top = top - 1;
    }
}

void push(char x) {
    if (top == 400) {
        return;
    } else {
        stack[++top] = x;
    }
}

int main() {

    unsigned long t, n, i = 0, j = 0;
    char a[400];
    scanf("%lu", &t);

    while(t--) {
        scanf("%s", &a);
        n = strlen(a);
        for (i = 0; i < n; i++) {
            if (a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/' || a[i] == '^') {
                push(a[i]);
            } else if (a[i] == ')') {
                pop();
            } else if (a[i] == '(') {
                continue;
            } else {
                printf("%c", a[i]);
            }
        }
        printf("\n");
    }

    return 0;
}

你错过了写一些部分,还有另一个符号以及 +、-、* 和 / 即 ^,这也是评估答案所必需的。

于 2018-05-12T17:08:37.130 回答
0

你必须初始化 unsigned long i = 0 ;在 for 循环中,就好像您采用两个或多个测试用例一样,我将从上一个案例中的每个下一个案例的位置开始。

于 2014-05-07T06:41:00.380 回答
0

暂时唯一注意到的地方

`scanf("%u\n",&test_case);` //"%u" for unsigned not unsigned long

`scanf("%s\n",expr);` //%s : newline to not input are separated by white space
于 2013-04-24T16:01:16.700 回答
0

添加

top=0;
stack[0]=0;

for在函数中结束循环main并更改
for(;i<len;i++)for(i=0;i<len;i++).

于 2016-09-20T13:52:40.347 回答