学完之后,我的脑海里对队列与栈的初印象的核心就是:栈“后进先出” 队列“先进先出”
假设我们是我们有5个数据都是以上图的形式储存在栈与队列中,那么如果是栈的话,先出的是栈顶的元素即5 ;如果是队列的话,先出的栈底的元素即1。
了解完这些我们就可以来了解栈与队列的代码构成。
一.栈的代码构成
统一说明:assert(ps); 这条代码是判断栈是否建立成功
1.stack.h
这里使用typdef是为了便利我们后续程序类型的修改
2.STInit(栈的初始化)
过程总结:
1.创建一个空间储存数据
2. 检查malloc是否正常运行
3.将capacity的值同步创造空间的大小
4.将栈顶置为0
3. STDestroy(销毁栈)
过程总结:
1.先把结构体中储存数据的空间释放掉。然后在置为NULL;
2.将其余的置为初始化状态就OK了
4. STEmpty(判断是否为空)
过程总结:
1.如果top==0的话,说明此时栈内没有储存数据
5.STPop(弹出栈顶的元素)
过程说明:
1.判断是否为空,如果为空,取的值是随机地址上取的随机值,所以我们就要避免这种情况
2.因为栈是后进先出,所以我们要top--
6.STSize(返回栈内数据的大小)
过程说明:
1.因为栈内无存入数据是top为0,所以我们的ps->top同步了栈内数据长度的大小
7.STPush(插入元素)
过程说明:
1.首先判断我们的大小有没有等于栈内数据的大小,如果等于需要我们用realloc来扩容
2.如果ps->capacity==pa->top,我们扩容,然后判断realloc是否扩容成功,再把扩容地址传出去ps->a=tmp,做后然ps->capacity*=2
3.确认有空间后将传来的数据传给栈,ps->a[ps->top]=x,再然top++
8.STTop(返回栈顶的元素)
过程说明:
1.STDataType 与建立栈元素的类型一致可以直接引用
2.这个过程有点例外,因为我们不仅要确保栈的成功建立,而且要栈内有数据所以加了一个assert(!STEmoty(ps))
3.最后返回栈顶元素,注意!!!数组的下标是ps->top-1
二.队列的代码构成
统一说明:assert(pq)是判断队列是否创建成功
1.queue.h 文件
2.QInit(队列的初始化)
过程说明:
1.先让文件的内容置空即pq->head=pq->tail==NULL;
2.因为是初始话所以长度为0;
3.QDestroy (销毁队列)
过程说明:
1.我们首先建立一个QNode * cur=pq->head;因为head类似于头节点,所以我们可以利用这个特点来遍历释放内存,知道cur==NULL,跳出循环
2.让尾节点与头节点置零 即pq->head=pq->tail=NULL;
3.因为队列的内容都没了,所以我们要 pq->size=0
4. QPop(头删)
过程说明:
1.这里是头删所以我们要判断头节点是否有数据存入
2.如果判断头节点的下一个节点为NULL,我们删除头节点然后让头节点与尾节点(删除头节点)都为NULL
3.如果判断头节点的下一个节点不为NULL,我们建立一个QNode*next=pq->heaed->next;然后free掉(pq->head)的空间,并且让pq->head=next;
4.因为头删减少了一个已存的数据,所以我们要把size--;减小一个
5.QSize(返回数据长度)
过程说明:
1.长度一直在我们的pq->size中,所以我们只要return pq->size就行了
6.QEmpty(判断队列是否为空)
7.QFront(返回头的数据)
过程说明:
1.注意返回的类型QDataType是我们自己定义的,这是我们自己typedefine重新定义的
2.利用assert(!QEmpty(pq)); 让文件的内容不为空
3.return pq->head->data
8.QBack返回尾的数据)
过程说明:
1.注意返回的类型QDataType是我们自己定义的,这是我们自己typedefine重新定义的
2.利用assert(!QEmpty(pq)); 让文件的内容不为空
3.return pq->tail->data
9.QPush(插入元素)
过程说明:
1.建立新的节点 QNode*newnode=(QNode*)malloc(sizeof(QNode)),并且用判断节点是否创立成功
2.让新建节点的data为传过来的值且让新传来值的next==NULL
3.如果ps->tail ==ps->head==NULL;我们就要让ps->tail=ps->head=newnodee
4.如果ps->tail!=ps->head ,我们就要让ps->tail->next=newndoe,然后再ps->tail=newnode,注意这两台哦代码是不能置换的
5.由于添加了一位成员,我们要pq-<size++;