簡體   English   中英

多個測試用例中的字符數組

[英]Char array in multiple test cases

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

#define SIZE 100
char stack[SIZE];
int top = -1;

void push(char item)
{
    if(top >= SIZE-1)
    {
        printf("\nStack Overflow.");
    }
    else
    {
        top = top+1;
        stack[top] = item;
    }
}

char pop()
{
    char item;

    if(top <0)
    {
        printf("stack under flow: invalid infix expression");
    }
    else
    {
        item = stack[top];
        top = top-1;
        return(item);
    }
}

int is_operator(char symbol)
{
    if(symbol == '^' || symbol == '*' || symbol == '/' || symbol == '+' || symbol =='-')
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int precedence(char symbol)
{
    if(symbol == '^')
    {
        return(5);
    }
    else if(symbol == '/')
    {
        return(4);
    }
    else if(symbol == '*')
    {
        return(3);
    }
    else if(symbol == '+' )         
    {
        return(2);
    }
    else if(symbol == '-' )         
    {
        return(1);
    }
    else
    {
        return(0);
    }
}

void InfixToPostfix(char infix_exp[], char postfix_exp[])
{
    int i, j;
    char item;
    char x;

    push('(');                             
    strcat(infix_exp,")");                  

    i=0;
    j=0;
    item=infix_exp[i];         

    while(item != '\0')        
    {
        if(item == '(')
        {
            push(item);
        }
        else if( isdigit(item) || isalpha(item))
        {
            postfix_exp[j] = item;              /* add operand symbol to postfix expr */
            j++;
        }
        else if(is_operator(item) == 1)        /* means symbol is operator */
        {
            x=pop();
            while(is_operator(x) == 1 && precedence(x)>= precedence(item))
            {
                postfix_exp[j] = x;                  /* so pop all higher precendence operator and */
                j++;
                x = pop();                       /* add them to postfix expresion */
            }
            push(x);
            push(item);                 
        }
        else if(item == ')')        
        {
            x = pop();                  
            while(x != '(')              
            {
                postfix_exp[j] = x;
                j++;
                x = pop();
            }
        }
        else
        { 
            printf("\nInvalid infix Expression.\n");       
        }
        i++;
        item = infix_exp[i]; 
    } 
    if(top>0)
    {
        printf("\nInvalid infix Expression.\n");        

    }
    if(top>0)
    {
        printf("\nInvalid infix Expression.\n");        
    }
}

int main()
{
  int t;
  scanf("%d",&t);
  while(t--)
  {
    char infix[SIZE], postfix[SIZE];         /* declare infix string and postfix string */
    scanf("\n%[^\n]s",infix);
    InfixToPostfix(infix,postfix);                   /* call to convert */
    //printf("Postfix Expression: ");
    printf("%s\n",postfix);
    /* print postfix expression */
  }
    return 0;
}

這是將中綴轉換為后綴表達式的代碼我正在使用多個測試用例問題是第二次(第二個測試用例 postfix_exp 打印的比它應該多)輸入 2 a+b*(c^de)^(f+ g h)-ia (b+c)/d 輸出 abcd^e-fgh*+^*+i- abc+d/ fgh +^*+i-

你能告訴我什么是錯誤的,因為哪個“ fgh +^*+i-”在輸出的末尾連接了前一個表達式中的額外表達式?

postfix_exp 似乎被覆蓋,但我期待一個新的分配后綴表達式。 為什么要保存較早的數據(來自先前測試用例的數據)?

請在評論部分提出任何進一步的問題

您沒有使用終止'\\0'關閉postfix_exp 在第一次迭代后, postfix看起來像這樣

XXXXXXXXXXX0

在較短的第二個輸入之后,它看起來像

YYYYYYYXXXX0

其中X代表在第一次迭代中寫入的字符, Y代表在第二次迭代中寫入的字符。 因此,當您打印它時,它也會包含最后一次迭代結果。

添加這個postfix_exp[j] = '\\0'; if (top>0)行之前。

請注意,這仍然是未定義的行為,因為postfix數組是未初始化的,並且不能保證它會被清零。

您應該通過添加終止 '\\0' 來關閉 postfix_exp

Add this postfix_exp[j] = '\0'; 

在 if (top>0) 行之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM