【发布时间】:2010-09-14 19:47:51
【问题描述】:
所以我现在正疯狂地从堆栈中读取字符。我将 char 存储为 int,所以我可以检查 EOF 信号,但事情进展不顺利。我是堆栈实现的新手,所以某些地方可能只是错误的。这是我的代码。
我在堆栈上得到了不正确的顶部字符(它显示 -1,它是 EOF,而不是输入的最后一个字符),以及某种内存错误 - “未分配被释放的指针” ,它引用了 destroyStack() 函数。
int main( void ) {
int *letter;
STACK *stack;
stack = createStack();
letter = (int *) malloc( sizeof( int ) );
printf("Please enter the letters, each on a new line, or to quit:\n");
while ( *letter != EOF || stackFull( stack ) ) {
*letter = getchar();
if ( *letter != '\n' && *letter != ' ' && *letter != EOF ) {
printf("Adding %c to the stack.\n", *letter);
pushStack( stack, letter );
}
}
free( letter );
printf("Stack count is %i\n", stackCount(stack));
letter = (int *) getStackTop( stack );
printf("The top char is %i\n", *letter);
destroyStack( stack );
return 0;
}
和我的堆栈代码:
typedef struct node {
void *dataPointer;
struct node *link;
} NODE;
typedef struct {
int count;
NODE *top;
} STACK;
STACK* createStack() {
STACK *stack;
stack = (STACK *) malloc( sizeof( STACK ) );
if ( stack ) {
stack->count = 0;
stack->top = NULL;
}
return stack;
}
bool pushStack( STACK *stack, void *pointerToData) {
NODE *newNode;
newNode = (NODE *) malloc( sizeof( NODE ) );
if ( !newNode ) {
return false;
}
newNode->dataPointer = pointerToData;
newNode->link = stack->top;
stack->top = newNode;
( stack->count )++;
return true;
}
void* popStack( STACK *stack ) {
void* topData;
NODE* temp;
if ( stack->count == 0 ) {
topData = NULL;
} else {
temp = stack->top;
topData = stack->top->dataPointer;
stack->top = stack->top->link;
free( temp );
( stack->count )--;
}
return topData;
}
void* getStackTop( STACK *stack ) {
if ( stack->count == 0 ) {
return NULL;
} else {
return stack->top->dataPointer;
}
}
bool stackEmpty( STACK *stack ) {
return ( stack->count == 0 );
}
bool stackFull( STACK *stack ) {
NODE *temp;
if ( ( temp = (NODE *) malloc( sizeof( *(stack->top) ) ) ) ) {
free( temp );
return false;
}
return true;
}
int stackCount( STACK *stack ) {
return ( stack->count );
}
STACK* destroyStack( STACK *stack ) {
NODE *temp;
if ( stack ) {
while ( stack->top != NULL ) {
free( stack->top->dataPointer );
temp = stack->top;
stack->top = stack->top->link;
free( temp );
}
free( stack );
}
return NULL;
}
【问题讨论】:
-
要格式化代码,在每行之前使用四个空格。您还可以按下一个按钮,为您完成此操作。
-
是的,我错过了
标签,它弄乱了我的格式。我搞定了。
-
是的。堆栈函数在正文中提供给我,我将使用堆栈进行赋值。这是我第一次使用堆栈,虽然我了解了所有概念,但我不明白为什么 destroyStack() 调用会引发错误,我也不明白当我从顶部阅读时出了什么问题堆栈。我正在阻止空格、换行符和文件结尾字符被扔到堆栈上。