在C中创建pop()函数堆栈实现
我的程序从用户输入创建一个字符堆栈,以星号结尾。PopAll()可以完美地逐个弹出每个元素,但重复使用pop()则不行。我不明白这是怎么回事,因为popAll()只是在引擎盖下使用pop() 谁能告诉我出了什么问题吗在C中创建pop()函数堆栈实现,c,char,stack,scanf,singly-linked-list,C,Char,Stack,Scanf,Singly Linked List,我的程序从用户输入创建一个字符堆栈,以星号结尾。PopAll()可以完美地逐个弹出每个元素,但重复使用pop()则不行。我不明白这是怎么回事,因为popAll()只是在引擎盖下使用pop() 谁能告诉我出了什么问题吗 #include <stdio.h> #include <stdlib.h> struct NODE { char value; struct NODE *prev; }; void push(char); void pop(); voi
#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();
}
}
#包括
#包括
结构节点{
字符值;
结构节点*prev;
};
无效推送(char);
void pop();
void popAll();
int校验终止符(char);
结构节点*TOP=NULL;
int main()
{
字符输入;
while(检查终止符(输入)==0){
scanf(“%c”,&input);
如果(检查终止符(输入)==0){
推(输入);
}
}
printf(“\n输出:\n”);
//不流行三种元素吗
pop();
pop();
pop();
//成功地弹出所有元素
//popAll();
}
int校验终止符(字符值){
开关(值){
案例“*”:
返回1;
违约:
返回0;
}
}
无效推送(字符值){
结构节点*当前=(结构节点*)malloc(sizeof(结构节点));
当前->值=值;
当前->上一个=顶部;
TOP=电流;
}
void pop(){
printf(“%c”,顶部->值);
TOP=TOP->prev;
}
void popAll(){
while(TOP!=NULL){
pop();
}
}
对于启动器,while循环具有未定义的行为,因为变量输入未初始化且具有不确定的值
char input;
while(checkTerminator(input) == 0){
在调用scanf
scanf(" %c", &input);
^^^^
否则,您将读取空白字符,例如新行字符'\n'
函数pop
产生内存泄漏,因为它不释放分配的节点
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
函数checkTerminator
可以编写得更简单。比如说
int checkTerminator( char c )
{
return c == '*';
}
除了弗拉德指出的问题外,我发现:
void pop(){
printf("%c", TOP->value);
TOP = TOP->prev;
}
如果TOP
为空或不为空,则不进行检查。最后,它变为NULL,您最终访问NULL ponter,这将给您带来分段错误。(如果只调用pop()多次)