堆栈的抽象数据类型:
类型名称:堆栈(stack)
数据对象集:一个有0个或多个元素的有穷线性表
操作集:......
一. 堆栈的顺式存储:代码如下
要点:1.为Data动态数组分配内存:规格为MaxSize
malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址
2.堆栈中struct需要的信息有Data(Data需要MaxSize),top(就是纸上的last)。在顺式存储中,top是int类型的。
3.堆栈满的标志:top+1==MaxSize。堆栈空的标志:top==-1。
二.堆栈链式存储。
要点:1.如果struct要用到PtrToNode,需要将typedef struct node * PtrToNode 放在结构体定义前面。
2.链式并不需要top和其位置信息。
3.最后需要把s->next指向s2->next并frees2。
4.堆栈满的标志:不需要判断堆栈满。堆栈空的标志:S->next=NULL。
三:队列顺式存储:
要点:1.队列需要front和Rear这两个位置信息,在顺式中,typedef int position;
2.循环队列,废置一个位置,这个位置是游动的。
3.队列位置个数:MaxSize。
可用位置个数:MaxSize-1。
队列满的标志:(front+1)%MaxSize==rear。
队列空的标志:front==rear。
4.无论是front还是rear,加1时,必须%MaxSize。
四.队列链式存储:
创建:
Queue CreateQueue() {
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Front = Q->Rear = NULL;
Q->MaxSize = MaxSize; // 如果不需要队列的最大容量,可以忽略这一行
return Q;
}
入队:
void AddQ(Queue Q, ElementType item) {
Position newNode = (Position)malloc(sizeof(struct Node));
newNode->Data = item;
newNode->Next = NULL;
if (IsEmpty(Q)) { // 如果队列为空
Q->Front = Q->Rear = newNode;
} else { // 队列非空
Q->Rear->Next = newNode;
Q->Rear = Q->Rear->Next;
}
}
出队:
bool IsEmpty( Queue Q )
{ return ( Q->Front == NULL);
}
ElementType DeleteQ( Queue Q )
{ Position FrontCell;
ElementType FrontElem;
if ( IsEmpty(Q) ) {
printf("队列空"); return ERROR;
}
else {
FrontCell = Q->Front;
if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
else
Q->Front = Q->Front->Next;
FrontElem = FrontCell->Data;
free( FrontCell ); /* 释放被删除结点空间 */
return FrontElem;
}
}
要点:1.链式存储既不是循环队列也不废置一个位置,就是正常队列。
2.队列为空的判断条件:Front==NULL;
只有一个元素的判断条件:Front==Rear。