大话数据结构读书笔记(3)----栈和链表

来源:互联网 发布:quick report软件下载 编辑:程序博客网 时间:2024/05/26 19:14

1、栈的定义

(stack)是限定仅在表尾进行插入和删除操作的线性表。
通常把允许插入和删除的一端成为栈顶(top),另一端称为栈底(bottom),栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

2、栈的顺序存储结构及实现

对于栈的插入(进栈),相当于做了如下处理。
这里写图片描述
对于进栈操作push,其代码如下:

/*插入元素e为新的栈顶元素*/Status Push(SqStack *S,SElemType e){    if(S->top==MAXSIZE-1)    {        return ERROR;    }    S->top++;    S->data[S->top]=e;    return OK;}

对于出栈操作pop,其代码如下:

/*若栈不空,则删除S的栈顶元素,用e返回,否则返回ERROR*/Status Push(SqStack *S,SElemType e){    if(S->top==-1)    {        return ERROR;    }    *e=S->data[S->top];    S->top--;    return OK;}

3、栈的链式存储结构及实现

对于链栈的进栈push操作,假设元素值为e的新节点为s,top为栈顶指针,代码如下:

/*插入元素e为新的栈顶元素*/Status Push(LinkStack *S,SElemType e){    LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));    s->data=e;    s->next=S->top;    S->top=s;    S->count++;    return OK;}

类似的出栈pop操作,假设变量p用来存储要删除的栈顶结点,将栈顶指针下移一位,最后释放p:

/*插入元素e为新的栈顶元素*/Status Push(LinkStack *S,SElemType *e){    LinkStackPtr p;    if(StackEmpty(*S))        return ERROR;           *e=s->top->data;    p=S->top;    S->top=S->top->next;    free(p);    S->count--;    return OK;}

4、队列的定义

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
如果队列的总个数不超过5个,但目前下标为2,3,4的位置已经被占用,接着入队的话就会产生输入越界的错误,可实际上,队列在下标为0和1的地方还是空闲的,如下图所示,这种现象叫做“假溢出”。
这里写图片描述
解决假溢出的方法就是后面满了,再从头开始,也就是头尾相接的循环。这种头尾相接的顺序存储结构称之为循环队列
循环队列的入队列操作代码如下:

/*若队列未满,则插入元素e为Q新的队尾元素*/Status EnQueue(SqQueue *Q,QElemType e){    if((Q->rear+1)%MAXSIZE==Q->front)        return ERROR;    Q->data[Q->rear]=e;    Q->rear=(Q->rear+1)%MAXSIZE;    return OK;}

循环队列的出队列操作代码如下:

/*若队列不空,则删除Q中队头元素,用e返回其值*/Status EnQueue(SqQueue *Q,QElemType e){    if(Q->rear==Q->front)        return ERROR;    *e=Q->data[Q->front];    Q->front=(Q->front+1)%MAXSIZE;    return OK;}

5、队列的链式存储结构及实现

队列的链式存储结构,其实就是线性表的单链表,只能尾进头出,简称为链队列。
链队列的入队和出队操作代码如下:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
在可以确定队列长度最大值的情况下,建议使用循环队列,如果无法预知队列的长度,则用链队列。