【大话数据结构】04 栈与队列 笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jvao_q7/article/details/80226516
《大话数据结构》
——程杰 共463页
笔记圈点主要内容,也请多多支持大话数据结构该书作者。

第 4 章 栈与队列

111页_定义
栈是限定在表尾进行插入和删除操作的线性表
队列是只允许在一端进行插入操作丶而在另一端进行删除操作的线性表

栈的插入操作,叫做进栈、压栈、入栈。
栈的删除操作,叫做出栈、弹栈。
在一些汇编代码、内存分析中会有不同的叫法,所以需要记住。

ADT 栈(stack)
Data 同线性表。元素具有相同的类型,相邻的元素具有前驱和后继关系。
Operation
InistStack(*S):初始化操作,建立一个空栈S。
DestroyStack(*S):若栈存在,则销毁它
ClearStack(*S)将栈清空
StackEmpty(S)若栈为空,返回true,否则返回false.
GetTop(S,*e)若栈存在且非空,用e返回S的栈顶元素
Push(*S,e)若栈S存在,插入新元素e到S中并成为栈顶元素
Pop(*S,*e)删除栈S中栈顶元素,并用e返回其值
StackLength(S)返回栈S的元素个数
endADT
栈是线性表的特例
栈的顺序存储结构

两栈共享空间
通常当两个栈的空间需求有相反关系时,一个增长时另一个栈在缩短的情况下

栈的链式存储结构
栈链一般不需要头结点

栈的链式存储结构————进栈操作
Status Push(LinkStack *S,SElemType e)
{
LinkStackptr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next=S->top; //把当前的栈顶元素赋值给新结点的直接后继
S->top=s; //将新的结点s赋值给栈顶指针
s->count++;
return OK;
}


栈的链式存储结构————出栈操作
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackptr p;
if(StackEmpty(*s))
return ERROR;
*e=s->top->data;
p=S->top; //将栈顶结点赋值给P
S->top=S->top->next; //使得栈顶指针下移一位,指向后一结点
free(p);//释放结点p
s->count--;
return OK;
}


如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些

126页_递归
斐波那契数列

递归的定义:
把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数
每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出
编译器使用栈实现递归

迭代和递归区别:
迭代使用循环结构,递归使用选择结构
递归代码整洁,但耗费大量时间和内存
迭代不需要反复调用函数和占用额外内存
//递归
int funcA(int n)
{
if(n>1)
return n+funcA(n-1);
else
return 1;
}
//迭代
int funcB(int n)
{
int i,s=0;
for(i=1;i<n;i++)
s+=i;
return s;
}

栈的应用:
四则运算表达式求值
——中缀表达式转后缀表达式
——后缀表达式(用来计算四则运算)


队列的定义:
队列是只允许在一段进行插入操作,而在另一端进行删除操作的线性表
队列是一种先进先出的线性表,简称FIFO,允许插入的一端称为队尾,允许删除的一端称为队头

队列的顺序存储结构:
(1)引用front指针指向头,rear指向下一位置,提高效率但产生了 假溢出

(2)引用了循环队列解决假溢出,并设置一个标志变量或者空一元素空间解决队列满与队列空分辨

(3)引用队列满条件(rear-front+QueueSize)%QueueSize == front 解决队列差一圈或是差一格区别


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


猜你喜欢

转载自blog.csdn.net/jvao_q7/article/details/80226516