2013-08-02 2 views
2

문제점을 해결하는 데 도움을 얻고 싶습니다. 나는 문자 시퀀스로서 표현식을 가지고 있는데, 나는 그것을 스택을 사용하여 분리하기를 원한다.이 표현식을 모든 피연산자와 연산자로 나눈다. 각각의 시퀀스는 순차적이며 스택으로 밀어 넣기를 원한다. 문제는 분리 한 후 표현식을 인쇄하려고 할 때 연산자 만 올바르게 표시되지만 피연산자가 올바르지 않은 것입니다. 최상위 요소와 동일한 피연산자 값만 표시합니다. 이유는 모르겠지만 이것이 내 코드입니다. 제발 저를 확인하도록 도와주세요. 정말 고맙습니다!스택을 사용하여 표현을 분리 할 수 ​​없습니다.

#include "stdio.h" 
#include "stdlib.h" 
#include "malloc.h" 
#include "string.h" 
#define SIZE 100 
typedef struct Stack{ 
    int top; 
    char *data[9]; 
}Stack; 

void init(Stack *s){ 
    s->top = 0; 
} 
void push(Stack *s, char *value){ 
    if(s->top < SIZE) 
     s->data[s->top++] = value; 
    else 
     printf("stack is full"); 
} 

bool isDigit(char s){ 
    if(s>='0' && s<='9') 
     return true; 
    return false; 
} 

void separate(Stack *exp,char *s){ 

    char temp[9]; 
    int n = strlen(s); 
    int l = 0,size=0; 
    for(int i = 0;i<n;i++){ 
     if(isDigit(s[i])){ 
      temp[l++]=s[i]; 

     } 
     else{   
      if(l!=0){ 
       temp[l]='\0';    
       push(exp,temp); 
       l=0;  
      } 

      char *c= (char*)malloc(sizeof(char)); 
      sprintf(c,"%c",s[i]); 
      push(exp,c); 
     }    
    } 
    temp[l]='\0'; 
    push(exp,temp); 

} 

void main(){ 
    Stack *s = (Stack*)malloc(sizeof(Stack)); 
    init(s); 
    char expression[100]; 
    printf("Enter your expression, for exp: 2-33/134+8\n"); 
    gets(expression); 
    separate(s,expression); 
    int size = s->top; 
    printf("\nsize = %d",size); 
    printf("\nElements of stack are"); 
    for(int i = 0;i<size;i++) 
     printf("\n %s",s->data[i]); 
    system("pause"); 
} 
+0

스택 오버플로에 오신 것을 환영합니다. 곧 [About] 페이지를 읽으십시오. '#include '등을 표준 헤더 (작성한 헤더가 아닌 시스템이 제공 한 헤더)에 대해 큰 따옴표가 아닌 꺽쇠 괄호로 묶어 사용하십시오. '#include '을 사용하지 말고 - 이미 사용 하듯이'#include '을 대신 사용하십시오. ''헤더는 메모리 할당 코드의 동작을 가져오고'-lmalloc'을 사용하여 메모리 할당 코드의 제어 가능한 버전을 수집 할 때만 관련이 있습니다. –

답변

1

모든 숫자 시퀀스를 저장하기 위해 동일한 메모리 위치 인 temp을 사용하고 있기 때문입니다. temp이 함수에 대해 로컬이고 포인터 (&temp[0])에 대한 액세스가 separate 함수 외부에서 정의되지 않았기 때문에 이것은 잘못되었습니다. malloc과 strcpy를 사용하여 새로운 문자열을 만들고 temp를 그것에 복사하십시오. 그런 다음이 새 문자열을 누릅니다. 또는 atoi을 사용하여 정수를 만들고 문자열을 푸시하는 대신 밀어 넣을 수 있습니다.

1

문제는이 라인

push(exp,temp); 

당신은 당신의 스택에 지역 변수 온도를 밀고 한 다음 다시에있다 그 다음 값에 대해 동일한 배열입니다. 스택은 결국 마지막 값인 동일한 값을 가리 킵니다. 예 : + 22 + 33 (11) 대신뿐만 아니라 malloc을 함께

보조 노트를 temp를 할당에만 33

저장합니다 : 대신 자신의 ctype.h에서 isdigit()를 사용합니다.

관련 문제