在 C 中创建 pop() 函数堆栈实现
Create pop() function stack implementation in C
我的程序根据用户输入创建了一堆字符,以星号结尾。 PopAll() 可以完美地逐个弹出每个元素,但反复使用 pop() 却不行。我不明白这是怎么发生的,因为 popAll() 只是在后台使用 pop()。
谁能告诉我这是怎么回事?
#include <stdio.h>
#include <stdlib.h>
struct NODE {
char value;
struct NODE *prev;
};
void push(char);
void pop();
void popAll();
int checkTerminator(char);
struct NODE *TOP = NULL;
int main()
{
char input;
while(checkTerminator(input) == 0){
scanf("%c", &input);
if(checkTerminator(input) == 0){
push(input);
}
}
printf("\nOutput:\n");
// Doesn't pop three elements
pop();
pop();
pop();
// Succesfully pops all elements
// popAll();
}
int checkTerminator(char value){
switch(value){
case '*':
return 1;
default:
return 0;
}
}
void push(char value){
struct NODE *CURRENT = (struct NODE*) malloc(sizeof(struct NODE));
CURRENT->value = value;
CURRENT->prev = TOP;
TOP = CURRENT;
}
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
void popAll(){
while(TOP != NULL){
pop();
}
}
对于初学者来说,while 循环具有未定义的行为,因为变量 input
未初始化且具有不确定的值。
char input;
while(checkTerminator(input) == 0){
并且你必须在 scanf
的调用中使用以下格式
scanf(" %c", &input);
^^^^
否则你会读到白色 space 字符,例如换行符 '\n'
.
函数 pop
产生内存泄漏,因为它没有释放分配的节点。
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
函数checkTerminator
可以写得更简单一点。例如
int checkTerminator( char c )
{
return c == '*';
}
除了 Vlad 指出的问题外,我还发现:
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
您没有检查 TOP
是否为 NULL。最后,它变成 NULL,你最终访问 NULL ponter,这会给你分段错误。 (如果你只调用 pop() 多次)。
我的程序根据用户输入创建了一堆字符,以星号结尾。 PopAll() 可以完美地逐个弹出每个元素,但反复使用 pop() 却不行。我不明白这是怎么发生的,因为 popAll() 只是在后台使用 pop()。
谁能告诉我这是怎么回事?
#include <stdio.h>
#include <stdlib.h>
struct NODE {
char value;
struct NODE *prev;
};
void push(char);
void pop();
void popAll();
int checkTerminator(char);
struct NODE *TOP = NULL;
int main()
{
char input;
while(checkTerminator(input) == 0){
scanf("%c", &input);
if(checkTerminator(input) == 0){
push(input);
}
}
printf("\nOutput:\n");
// Doesn't pop three elements
pop();
pop();
pop();
// Succesfully pops all elements
// popAll();
}
int checkTerminator(char value){
switch(value){
case '*':
return 1;
default:
return 0;
}
}
void push(char value){
struct NODE *CURRENT = (struct NODE*) malloc(sizeof(struct NODE));
CURRENT->value = value;
CURRENT->prev = TOP;
TOP = CURRENT;
}
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
void popAll(){
while(TOP != NULL){
pop();
}
}
对于初学者来说,while 循环具有未定义的行为,因为变量 input
未初始化且具有不确定的值。
char input;
while(checkTerminator(input) == 0){
并且你必须在 scanf
scanf(" %c", &input);
^^^^
否则你会读到白色 space 字符,例如换行符 '\n'
.
函数 pop
产生内存泄漏,因为它没有释放分配的节点。
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
函数checkTerminator
可以写得更简单一点。例如
int checkTerminator( char c )
{
return c == '*';
}
除了 Vlad 指出的问题外,我还发现:
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
您没有检查 TOP
是否为 NULL。最后,它变成 NULL,你最终访问 NULL ponter,这会给你分段错误。 (如果你只调用 pop() 多次)。