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

你可能感兴趣的:(数据结构与算法)