将字符串插入堆栈 returns 个随机字符

Inserting string into stack returns random character

正在将字符串压入我的堆栈,目前我正在获取随机字符(这些字符没有被压入堆栈,因为当我之后检查时我的堆栈是空的)

这里是相关的函数和结构

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 push_string(POINTER *Top,char *string)
/* Push a string of characters into a stack. */
    {
        char *tmp = malloc(strlen(string) + 1);
        if (tmp)
        strcpy(tmp, string);
    push(&Top,tmp);

我在另一个 SO 线程上找到的第二个函数的一部分。 这就是我使用它的方式:

main()
    {
    POINTER top;
        top= (POINTER) NULL;
        stackitem A='A';
        stackitem B='B';
        char *C="12345";
        push_string(&top,C);
        print_stack(top);

        return 0;
   }
      

如何将字符串添加到堆栈? push 函数用于将字符压入堆栈,但我无法让它压入整个字符串。

首先,打开所有警告(选项-Wall -pedantic)。 编译器可能会抱怨不兼容类型之间的转换。

函数push()专用于将单个char入栈,而push_string()专用于将string的所有字符一个一个入栈。

因此要放置一个字符串,您应该单独放置字符串的每个字符。

void push_string(POINTER *Top,char *string) {
  for (char *s = string; *s; ++s)
    push(Top, *s);
}

函数 push_string 的代码片段没有任何意义。

例如,不需要创建传递字符串的副本。

    char *tmp = malloc(strlen(string) + 1);
    if (tmp)
    strcpy(tmp, string);

其次调用

push(&Top,tmp);

参数类型无效。

函数push_string可以看成下面的样子

void push_string( POINTER *Top, const char *string )
{
    for ( ; *string; ++string ) push( Top, *string );
}

这是一个演示程序。

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

typedef char stackitem;

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

typedef  struct stack ELEMENT;
typedef  ELEMENT   *POINTER;

int push( POINTER *Top, stackitem c )
{
    POINTER temp = malloc( sizeof( ELEMENT ) );
    int success = temp != NULL;
    
    if ( success )
    {
        temp->d = c;
        temp->next = *Top;
        *Top = temp;
    }
    
    return success;
}

void push_string( POINTER *Top, const char *string )
{
    for ( ; *string; ++string ) push( Top, *string );
}

int pop( POINTER *Top, stackitem *c )
{
    int success = *Top != NULL;
    
    if ( success )
    {
        *c = ( *Top )->d;
        POINTER temp = *Top;
        *Top = ( *Top )->next;
        free( temp );
    }
    
    return success;
}

int main(void) 
{
    POINTER top = NULL;
    
    push_string( &top, "12345" );
    
    for ( char c; pop( &top, &c ); )
    {
        putchar( c );
    }
    putchar( '\n' );
    
    return 0;
}

程序输出为

54321

注意检查栈中新节点的内存分配是否成功

在演示程序中,函数push报告元素推送是否成功。

函数push_string也应该报告字符串是否被成功推送。这种情况下可以这样定义

int push_string( POINTER *Top, const char *string )
{
    while ( *string && push( Top, *string ) ) ++string;
  
    return *string == '[=15=]';
}

只需将上面演示程序中的函数 push_string 替换为这个函数,程序就会按预期运行。