在练习链栈的时候,发现空栈的条件总是为假.出栈到最后一个字母时报错!
Seqstack.h
#include<stdio.h> #include<stdlib.h> #include"Seqstack.h" int InitStack(SeqStk *std) { std->top=0; return 1; } int EmptyStack(SeqStk *stk) { return stk->top==0; } int Push(SeqStk *stk,DataType x) { if(stk->top==maxsize) { printf("栈已满!"); return 0; } stk->data[(stk->top)++]=x; return 1; } int Pop(SeqStk *stk) { if(EmptyStack(stk)) { printf("栈下溢!"); return 0; } stk->top--; return 1; } DataType GetTop(SeqStk *stk) { if(EmptyStack(stk)) { printf("空栈无法获取顶端元素!"); exit(1); } return stk->data[stk->top]; } void InitStackLK(LkStk *ls) { ls=(LkStk *)malloc(sizeof(LkStk)); ls->next=NULL; ls->data=0; } int EmptyStackLK(LkStk *ls) { if(NULL==ls->next) return 1; else return 0; } void PushLK(LkStk * ls,DataType data) { LkStk *temp; temp=(LkStk*)malloc(sizeof(LkStk)); temp->data=data; temp->next=ls->next; ls->next=temp; } int PopLK(LkStk *ls) { LkStk * temp; if(EmptyStackLK(ls)) { return 0; } temp=ls->next; ls->next=temp->next; free(temp); return 1; } DataType GetTopLK(LkStk * ls) { if(EmptyStackLK(ls)) { exit(1); } return ls->next->data; }
Seqstack.h
#include<stdio.h> /*顺序栈定义*/ #define maxsize 6 typedef int DataType; typedef struct seqstack { DataType data[maxsize]; int top; } SeqStk; int InitStack(SeqStk *std);//初始化栈 int EmptyStack(SeqStk *stk);//判断栈是否为空 int Push(SeqStk *stk,DataType x);//进栈 int Pop(SeqStk *stk);//出栈 typedef struct node { DataType data; struct node * next; } LkStk; void InitStackLK(LkStk *ls); int EmptyStackLK(LkStk *ls); void PushLK(LkStk * ls,DataType data); int PopLK(LkStk *ls); DataType GetTopLK(LkStk * ls);
Test2.c
#include<stdio.h> #include"Seqstack.h" int main(void) { LkStk lstk; char ch; InitStackLK(&lstk); for(ch='A';ch<='A'+26;ch++) { PushLK(&lstk,ch); printf("%c\r\n",ch); } printf("\r\n\r\n"); while(!EmptyStackLK(&lstk)) { ch=GetTopLK(&lstk); PopLK(&lstk); printf("%c",ch); } getchar(); return 0; }
很简单,你应该清理了你的代码再上传的。
并且,你应该学一些调试方法。
注意你这个调用:
InitStackLK(&lstk);
然后看你的方法:
void InitStackLK(LkStk *ls)
{
ls=(LkStk *)malloc(sizeof(LkStk));
ls->next=NULL;
ls->data=0;
}
你的这段代码给ls赋值了,问题是ls所在的地址区域是调用时临时分配的,而你用这句代码给他赋值——新值:
ls=(LkStk *)malloc(sizeof(LkStk));
因此你丢失了原来的值,也丢失了新分配的东西,造成了内存泄露。
解决方法是注释掉这一句。这是由你的定义方法所保证的。在main函数中
LkStk lstk;
你是这样声明的。
这个给他分配了内存空间,只是没有初始化而已。
或者,一个较为复杂的方法,是这样修改,将这个修改为指针:
LkStk* lstk;
但那样就大动干戈,整个程序都要修改了。不过初始化程序可以这样改:
void InitStackLK(LkStk **ls)
{
*ls=(LkStk *)malloc(sizeof(LkStk));
(*ls)->next=NULL;
(*ls)->data=0;
}
拿分来。
不要一味的贴代码,明确的表述你的问题最为重要。
int EmptyStackLK(LkStk *ls) { if(NULL==ls->next) return 1;//这里不能够正确判断,当出栈到最后一个节点时还是返回1. else return 0; }