本来想说,跟着看那个算法之路,但是发现数据结构与算法分析(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