2010-12-13 31 views
7

Giáo sư của chúng tôi yêu cầu chúng tôi kiểm tra xem một từ có phải là palindrome hay không bằng cách sử dụng ngăn xếp. Mỗi khi tôi chạy, có lỗi: Unhandled Exception. Access violation Tôi đang làm gì sai? Làm thế nào tôi có thể cải thiện mã của tôi? Mã của tôi là như sau:Palindrome Sử dụng ngăn xếp

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 


int main(){ 
    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
    } 
    i = 0; 
    while(pop(&head)==word[i]){ 
     i++; 
    } 
    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 
} 
+0

đầu tiên: sử dụng 'giá trị' thay vì' giá trị [i] 'trong chữ ký của các chức năng. – ruslik

Trả lời

7

chức năng push bạn nên

  • địa chỉ của ngăn xếp đầu (bạn đã nó đúng) và
  • nhân vật mà cần phải được đẩy vào (điều này cần sửa).

Vì vậy, các phương pháp chữ ký trở thành:

void push(Stack**head, char value); 

và trong cơ thể của hàm bạn thêm value để phía trên cùng của ngăn xếp như:

temp->name = value; 

Ngoài ra, bạn phải luôn luôn kiểm tra sự trở lại giá trị của malloc.

Vì bạn đang trở về giá trị xuất hiện từ hàm pop đó là kiểu trả về không phải void, thay đổi nó để char trong cả việc kê khai và định nghĩa như sau:

char pop(Stack**head) 

Có một lỗi logic:

Để bắt đầu, bạn đẩy tất cả ký tự của đầu vào vào ngăn xếp. Tiếp theo bạn bắt đầu popping các ký tự. Không có điều kiện chấm dứt cho popping của bạn. Khi bạn đã xuất hiện tất cả các ký tự (vì vậy ngăn xếp của bạn trống) cuộc gọi tiếp theo tới pop sẽ dẫn đến sự cố vì bạn sẽ bị hủy bỏ một con trỏ NULL (*head sẽ là NULL).

Để khắc phục điều này, bạn bật chỉ các ký tự bạn đã đẩy bằng cách thực hiện:

while(i<lenght && pop(&head)==word[i]){ 

Kể từ khi && là ngắn mạch, pop sẽ không được gọi là một khi bạn đã xuất hiện tất cả các nhân vật.

Cách khác (và cách tiếp cận ưa thích) là viết một hàm khác gọi là isEmpty trả về true/1 khi ngăn xếp trống và sử dụng phương pháp này trước khi bạn gọi phương thức pop.

+0

lỗi thứ hai của tôi là giá trị void không được bỏ qua vì nó phải là – newbie

+0

@newbie: Xem câu trả lời cập nhật của tôi. – codaddict

+0

tnx rất nhiều :) bây giờ nó đang làm việc – newbie

1

Đây là chức năng như bạn đang gọi nó:

push(&head, i, word[i]); 

Đây là chức năng khi được công bố và xác định:

void push(Stack**head, int i, char value[i]); 

Vì vậy, arg 3 trong khai báo là một mảng ký tự, trong khi arg 3 trong phần gọi là một nhân vật.Thay đổi push() của bạn để sử dụng một ký tự cho value và chỉ cần bỏ qua i:

void push(Stack**head, char value){ 
    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

Bây giờ gọi nó với:

push(&head, word[i]); 
+0

lỗi thứ hai của tôi là void giá trị không được bỏ qua vì nó phải là – newbie

+0

@newbie 'pop()' được khai báo là một hàm void nhưng đang trả về 'val'. – chrisaycock

+0

lỗi khác xảy ra khi chạy chương trình – newbie

2

Tôi nghĩ bạn nên thay đổi 'khoảng trống pop (Stack ** đầu) {' vào

char pop(Stack **head) { 

và cũng bảo vệ chống lại ngăn xếp rỗng:

char pop(Stack**head){ 
Stack* temp; 
char val; 
temp = *head; 
if (!temp) return 0; 
val = temp->name; 
*head = (*head)->next; 
free(temp); 
return val; 
} 
2

bạn nên kiểm tra xem bạn giàu cuối chồng hay không trong mã của bạn:

while(i < length && pop(&head)==word[i]){ 
     i++; 
    } 
+0

cảm ơn bạn ... :) – newbie

2

Bạn cũng có thể xem xét sử dụng "đệ quy" đó là bằng cách nào đó tương tự như xây dựng một chồng, chỉ là nó được thực hiện cho bạn phương thức gọi ngầm.
Vấn đề palindrome là bài tập cổ điển để tìm hiểu sức mạnh của đệ quy :)

1

mã của bạn gặp sự cố ở phần while-pop.

Đối với sự thuận lợi của bạn, tôi có kèm theo mã làm việc sửa đổi cho bạn:

typedef struct stack{ 
    char name; 
    struct stack * next; 
}Stack; 

void push(Stack**head, char value); 
char pop(Stack**head); 



int main (int argc, const char * argv[]) { 


    char word[11]; 
    int i=0; 
    int lenght = 0; 
    Stack*head = NULL; 
    printf("Please type the word: "); 
    scanf("%s", word); 
    lenght = strlen(word); 
    while(word[i]!='\0'){ 
     push(&head, word[i]); 
     i++; 
     } 

    //i = 0; 
    //while(pop(&head)==word[i]){ 
    // i++; 
    //} 

    int counter=0; 
    i=0; 
    for (counter=0; counter<lenght; counter++) { 
    if (pop(&head) == word[counter]) 
    { 
     i++; 
    } 
    } 


    if(i==lenght) printf("The word is a palindrome"); 
    else printf("The word is not a palindrome"); 


    return 0; 
} 

void push(Stack**head,char value){ 

    Stack *temp = (Stack*)malloc(sizeof(Stack)); 
    temp->name = value; 
    temp->next = *head; 
    *head = temp; 
} 

char pop(Stack**head){ 

    Stack* temp; 

    char val; 
    temp = *head; 
    val = temp->name; 
    *head = (*head)->next; 

    free(temp); 
    return val; 
} 
Các vấn đề liên quan