2017-09-26 98 views
1

我的代碼運行良好,令我驚喜! 唯一的問題是,無論何時使用括號中綴輸入,它都會在後綴表達式結尾處出現'J'!有什麼建議麼?? 這裏的算法是最基本的算法,所有的表達式都被轉換,所有的都是正確的,但是尾部的'J'是我無法理解的!建議?堆棧中綴到後綴

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

#define MAX 50 

char stack[MAX]; 

int top = -1; 

void push(char element) 
{ 
    stack[++top] = element; 
} 

char pop() 
{ 
    return(stack[top--]); 
} 

char tope() 
{ 
    return(stack[top]); 
} 

int prec(char c) 
{ 
    switch(c){ 
     case '+': 
     case '-' : return 1; 
        break; 
     case '*' : 
     case '/' : return 2; 
        break; 
     default: 
        return 0; 
        break; 
     } 
} 

int main() 
{ 

    char post[MAX],in[MAX],ch,element; 
    printf("Infix expression : "); 
    scanf("%s",in); 

    int i=0,k=0; 

    in[strlen(in)] = ')'; 
    push('('); 

    while((ch = in[i++]) != '\0') 
    { 
     if(isalnum(ch)) 
      post[k++] = ch; 
     if(ch == '(') 
      push(ch); 
     if(ch == ')') 
     { 
      while(tope() != '(') 
      { 
       post[k++] = pop(); 
      } 
      pop(); 
     } 
     if(ch == '+' || ch =='-' || ch == '*' || ch == '/') 
     { 
      while(prec(ch) <= prec(tope())) 
      { 
       post[k++] = pop(); 
      } 
      push(ch); 
     } 
    } 
    post[k] = '\0'; 

    printf("%s",post); 

    return 0; 




} 
+0

爲什麼不把''''作爲''''來處理空字符,而不是將'''添加到字符串的末尾? – Barmar

+0

是的,Barmar,這是一個解決方案,但我想以不同的方式做到這一點! –

回答

2
in[strlen(in)] = ')'; 

覆蓋NUL終止字符,打印時,這也解釋了奇怪的字符(印刷會議由運氣另一個NUL字符時,僅停止:如果沒有NUL字符被發現不確定的行爲甚至可能導致崩潰在in 50字節的緩衝區)

你有這樣的轉變呢,比如:

int l = strlen(in); 
in[l] = ')'; 
in[l+1] = '\0'; 

注意:您存儲您的字符串的長度在l而不是調用strlen(in)兩次,不僅因爲性能損失,但因爲括號意味着strlen不能正常工作,直到你空終止。

(也你可能想保護你scanf這樣的:scanf("%48s",in);所以你一定要有足夠的空間,爲您的50大小的緩衝區額外的括號,即使你的宏定義兼容,見scanf: template with macro (#define constant) inside

+0

非常感謝Jean,我在同一點上徘徊,但當輸入不包含括號時,因爲它沒有空字符,所以感到困惑! –

+0

問題依然存在! –

+0

D:\ Soft \ C \ C> a.exe 中綴表達式:4 *(5 + 3) 453 + * j –