Реализация стека в C вставка строки - PullRequest
0 голосов
/ 05 апреля 2020

У меня проблемы с вставкой строки в стек, по какой-то причине, когда я вставляю строку в стек, я получаю случайный символ вместо него.

Я выделил пространство строки, чтобы я считаю, что это должно работать правильно. main. c

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

/* Stack structure definition */
typedef char stackitem;

struct stack {
    stackitem  d;
    struct stack *next;
};

typedef  struct stack ELEMENT;
typedef  ELEMENT   *POINTER;


void push(POINTER *Top, stackitem a)
/* Put item a into the top of the stack */
{
    POINTER temp;
    temp = malloc(sizeof(ELEMENT));
    temp->d = a;
    temp->next = *Top;
    *Top = temp;
    printf("Insert element %c\n", temp->d);
}

void pop(POINTER *Top)
/* Remove the top item */
{
    POINTER Top1 = *Top;
    if (Top != NULL)
    {
        *Top = Top1->next;
        printf("Remove element %c\n", Top1->d);
        free(Top1);
    }
    else
        printf("Empty stack.\n");
}

void print_stack(POINTER Top)
/*Print the contents of the stack. Do not modify the stack in any way. */
{
    printf("Start printing the stack ...\n");
    POINTER temp = Top;
    while(temp != NULL) {
        printf("%c\n", temp->d);
        temp = temp->next;
    }

}

void delete_stack(POINTER *Top)
/* Delete the stack, i.e. remove all items from the stack */
{
    printf("Start deleting the stack...\n");

    POINTER Top1 = *Top;
   while (Top != NULL)
    {
        *Top = Top1->next;
        printf("Deleting element %c\n", Top1->d);
        free(Top1);
        Top1 = *Top;
    }

}

void push_string(POINTER *Top,char *string)
/* Push a string of characters into a stack. */
{
    printf("Start inserting the string ...\n");

    POINTER temp;
    temp = malloc(sizeof(string));
    temp->d = ( char * )malloc( ( strlen( string ) + 1 ) * sizeof( char ) );
    temp->next = *Top;
    *Top = temp;
    printf("Insert element %c\n", temp->d);
}

main()
{

    POINTER top;
    top= (POINTER) NULL;
    stackitem A='A';
    stackitem B='B';
    char *C="12345";
    //printf("C is %s\n", C);
    push(&top,A);
    push(&top,B);
    print_stack(top);
//    pop(&top);
//    pop(&top);
//  print_stack(top);
    push_string(&top,C);
    print_stack(top);
    delete_stack(&top);
    print_stack(top);

}

Если я пытаюсь вставить строку, я получаю один случайный символ вместо всей строки в стеке.

1 Ответ

0 голосов
/ 05 апреля 2020

вы не можете поместить строку в один символ. Вот эта char *C="12345"; строка, но stackitem d; это char d, поэтому в void push(POINTER *Top, stackitem a) эта temp->d = a; недопустима для полной строки также в void push_string(POINTER *Top,char *string) вы не можете хранить строку в одном символе. Вы должны послать строку char символом, как показано ниже. Придумайте, если вы хотите, чтобы в вашей структуре был один символ или массив символов, затем напишите свои функции на основе этого.

в вашей функции push_string tmep - это POINTER, поэтому вы не должны выделять для него память в виде строки. Также вы выделяете память только для temp->d, вы не копируете в нее данные.

в приведенной ниже функции я отправляю символ на push_stirng (который не нужен, вы можете использовать только push, но назовите его, как показано ниже в main):

void push_string(POINTER* Top, char string)
/* Push a string of characters into a stack. */
{
    printf("Start inserting the string ...\n");

    POINTER temp;
    temp = malloc(sizeof(POINTER));
    temp->d = (char*)malloc(sizeof(char));
    temp->d = string;
    temp->next = *Top;
    *Top = temp;
    printf("Insert element %c\n", temp->d);
}

и назовите его так:

    for (int i = 0; C[i] != '\0'; i++)
    {
        push_string(&top, C[i]);
        //also if you want '\0' too after loop you can use this char t='\0';push_string(&top, t);
    }

также изменяется при удалении стека, а условие на while (Top1 != NULL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...