将字符串插入堆栈 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
替换为这个函数,程序就会按预期运行。
正在将字符串压入我的堆栈,目前我正在获取随机字符(这些字符没有被压入堆栈,因为当我之后检查时我的堆栈是空的)
这里是相关的函数和结构
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
替换为这个函数,程序就会按预期运行。