在C中使用堆栈反转句子

时间:2014-02-18 08:55:13

标签: c data-structures stack

我想在c中使用堆栈来反转句子。 例如。你怎么样=>你就是这样。

我写了以下程序

#include<stdio.h>
#include<conio.h>
struct rev
{
    char *var;
    struct rev *next;       
};
struct rev *top=NULL;
struct rev *temp,*test;
main()
{
    int start, j = 0;
    char *p="Hi, How are you? Hope everything is fine";
    char *s;
    char *t;
    *t = '\0';
    s = p;
    while(1) {
        if(*p == ' '|| *p == '\0') {
            printf("Inside if \n");
            *(t + j) = '\0';
            printf("This is t %s\n",t);

            if(top == NULL) {
                temp = (struct rev *)malloc(sizeof(struct rev));
                temp->next = NULL;
                temp->var=t;
                top = temp; 
            } else {
                temp = (struct rev *)malloc(sizeof(struct rev));
                printf("This is going in stack %s\n", t);
                temp->var = t;
                temp->next = top;
                top = temp;
                printf("This is top %s\n", top->var);
            }
            j = 0;         
        } else {
            *(t+j) = *p;
            printf("%c\n", *p);
            j++;    
        }   
        if(*p == '\0') {
            break;
        }

        //printf("%c",*p);              
        p++;
    }
    struct rev *show;
    show = top;
    while(show != NULL) {
        printf("%s\n", show->var);
        show = show->next;               
    }

    getch();      
}

它正确存储但在遍历时它只给出最终元素。 我无法弄清楚问题是什么。 这是我的输出窗口: -

enter image description here

5 个答案:

答案 0 :(得分:2)

阅读完整行。在空格上标记字符串,将每个单词推送到堆栈。打印时弹出堆栈。

有用的功能:

完整的解决方案可以在不到20行(包括结构定义,头文件等)中完成。


您的代码中也存在未定义行为的问题。你有一个指针p指向一个常量字符数组(所有字符串文字都是常量字符数组)。然后你尝试修改那个常量数组。

你可能想要这样的东西:

char arr[] = "Some string here";
char *p = arr;

你还有另一个未定义行为的情况:你有一个未初始化的指针t。然后,您继续取消引用它。我会说你很幸运没有崩溃。

您也不会在循环中更新t,您可能应该这样做。

答案 1 :(得分:1)

首先,你的char *t只是一个指针,让它指向malloced内存,然后继续......我不明白代码是如何运行的......你正在做*(t + j)当t实际上指向垃圾。

首先看一下你在解析一个字符串后覆盖t ...即你设置j = 0并覆盖以前存储的字符串,你的struct rev按住指向这个t的指针 你得到you? you? you?作为输出。而不是让char *var中的struct rev指向t .. char *var指向一个malloced记忆并执行strcpystrtok

我刚刚对你的代码进行了粗略的修改,它在linux + gcc上对我有用......以下是代码:

#include<stdio.h>
#include <stdlib.h>
struct rev
{
    char *var;
    struct rev *next;       
};
struct rev *top=NULL;
struct rev *temp,*test;
main()
{
    int start, j = 0;
    char *p="How are you?";
    char *s;
    char *t;
    t = malloc(1000);
    if (t == NULL) {
        //OUT OF MEMORY
        exit(1);
    }
    s = p;
    while(1) {
        if(*p == ' '|| *p == '\0') {
            printf("Inside if \n");
            *(t + j) = '\0';
            printf("This is t %s\n",t);

            if(top == NULL) {
                temp = (struct rev *)malloc(sizeof(struct rev));
                temp->next = NULL;
                temp->var = malloc(100);
                if (temp->var == NULL) {
                   //OUT OF MEMORY
                   exit(1);
                }
                strcpy(temp->var, t);
                top = temp; 
            } else {
                temp = (struct rev *)malloc(sizeof(struct rev));
                printf("This is going in stack %s\n", t);
                temp->var = malloc(100);
                 if (temp->var == NULL) {
                   //OUT OF MEMORY
                   exit(1);
                }
                strcpy(temp->var, t);
                temp->next = top;
                top = temp;
                printf("This is top %s\n", top->var);
            }
            j = 0;
        } else {
            *(t+j) = *p;
            printf("%c\n", *p);
            j++;    
        }   
        if(*p == '\0') {
            break;
        }

        //printf("%c",*p);              
        p++;
    }
    struct rev *show;
    show = top;
    while(show != NULL) {
        printf("%s\n", show->var);
        show = show->next;               
    }

    //getch();      
}

这是输出:

H
o
w
Inside if 
This is t How
a
r
e
Inside if 
This is t are
This is going in stack are
This is top are
y
o
u
?
Inside if 
This is t you?
This is going in stack you?
This is top you?
you?
are
How

PS:我不会考虑您正在实施的代码的哪一部分push|pop ...您正在使用列表并告诉您想要一个堆栈。 Stack和List是两种不同的数据结构。

答案 2 :(得分:0)

您可以从初始化变量t开始,指向有效的内存地址。

答案 3 :(得分:0)

似乎“show”的逻辑写得不正确 -

show = top;
while(show != NULL) {
    printf("%s\n", show->var);
    show = show->next;               
}

将节目指向顶部并打印“show-&gt; next”是从堆栈中弹出的错误方式。

答案 4 :(得分:0)

这是pop功能的一个例子 -

int pop(STACK **head) {
if (empty(*head)) {                         
   fputs("Error: stack underflow\n", stderr);
   abort();
} else {                                    
    STACK *top = *head;
    int value = top->data;
    *head = top->next;
    free(top);
    return value;}}