您的位置:首页 > 理论基础 > 数据结构算法

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

2017-10-08 16:49 260 查看

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、队列的链式存储结构及实现

队列的链式存储结构,其实就是线性表的单链表,只能尾进头出,简称为链队列。

链队列的入队和出队操作代码如下:



4000







在可以确定队列长度最大值的情况下,建议使用循环队列,如果无法预知队列的长度,则用链队列。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息