栈
来源:互联网 发布:license管理系统源码 编辑:程序博客网 时间:2024/06/05 16:10
本来想说,跟着看那个算法之路,但是发现数据结构与算法分析(C语言)并不是很好理解,其实它给的代码都是挺规范的,可能就是太规范了,所以不能直击要害,让人看着费解~~所以转向去听教程,浙大的数据结构教程还不错!
栈的数组实现
应该是栈的顺序存储结构,这个结构是由数组+栈顶元素变量实现的
定义栈的结构体
typedef struct{ ElementType Data[MaxSize];//数组 int Top;//栈顶变量 }Stack;
typedef,不知道干嘛的?可能与Stack有关
ElementType,Data中存储的数据类型,可以是int,double,float…
程序基本都是照抄的,因为我不会呀!!!初次学都是这样,没必要感到难过,那个算法之路的大神不也是,不理解就一遍遍的纸上代码吗??但是每一遍都要努力去理解!
为啥非得用PtrS去访问?PtrS是这个stack结构体的指针,可以访问Top,Data变量
呵呵,Ptr – pointer 指针, 至于PtrS – pointer to Stack
向栈里面push元素,先检查栈是不是满了,Top
然后++Top,再向Data里面放元素!
push
void Push(Stack *PtrS,ElementType item){ if (PtrS->Top==MaxSize-1){ printf("Error!The stack is full.");return; }else{ PtrS->Data[++(PtrS->Top)]=item; return; } }
pop
ElementType Pop(Stack *PtrS){ if(PtrS->Top==-1){ printf("The Stack is empty"); return ERROR; }else{ return PtrS->Data[(PtrS->Pop)--];//就是只能PtrS指针访问结构体! } }
只能PtrS指针访问结构体!不管是Data还是Top,都只能用PtrS指针访问!!!
习题,用一个数组实现两个栈!原理挺简单的
Top1,Top2的初始值不一样!
堆栈满的条件也不同!PtrS->Top2 – PtrS->Top1 == 1
还要区分对哪个堆栈操作!
栈的链表实现
定义声明链栈的结构体
typedef struct Node{ ElementType Data; struct Node *Next; }LinkStack; LinkStack *Top;
CreateStack
LinkStack *CreateStack(){ /* 构建一个堆栈的头结点,返回指针 */ LinkStack *S; S = malloc( sizeof(struct Node)); S->Next = NULL; return S; }
IsEmpty
int IsEmpty( LinkStack *S ){ /*判断堆栈S是否为空,若为空函数返回整数1,否则返回0 */ return ( S->Next == NULL );}
push
void Push( ElementType item, LinkStack *S ){ /* 将元素item压入堆栈S */ struct Node *TmpCell; TmpCell = malloc( sizeof( struct Node ) ); TmpCell->Element = item; TmpCell->Next = S->Next;//不能理解!不能理解!不能理解! S->Next = TmpCell;}
pop
ElementType Pop( LinkStack *S ){ /* 删除并返回堆栈S的栈顶元素 */ struct Node *FirstCell; ElementType TopElem; if( IsEmpty( S ) ) { printf(“堆栈空”); return NULL; } else { FirstCell = S->Next;//这就是栈顶S S->Next = FirstCell->Next;//不能理解!不能理解!不能理解! TopElem = FirstCell ->Element; free(FirstCell); return TopElem; }}
发现了一个可以图解数据结构与算法的网站,还蛮有意思的VisuAlgo-visualising_algorithm
0 0