数据结构专升本资料第三周.docVIP

  • 1
  • 0
  • 约5.46千字
  • 约 16页
  • 2019-10-21 发布于山西
  • 举报
堆栈和队列 栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只有其运算规则较线性表有更多的限制,故又称它们为运算受限的线性表。 3.1 栈 一、栈的定义 栈(Stack):是限制仅在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。 栈的修改是按后进先出的原则进行的。因此,栈又称为后进先出(Last In First Out)的线性表,简称为 LIFO表。 二、栈的基本运算 1、InitStack(S) 构造一个空栈S。    2、StackEmpty(S) 判栈空。若S为空栈,则返回TRUE,否则返回FALSE。 3、StackFull(S) 判栈满。若S为满栈,则返回TRUE,否则返回FALSE。该运算只适用于栈的顺序存储结构。    4、Push(S,x) 进栈。若栈S不满,则将元素x插入S的栈顶。   5、Pop(S) 退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。 6、StackTop(S) 取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态。 三、顺序栈 顺序栈:即栈的顺序存储结构,是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。 顺序栈的类型定义:  #define StackSize 100 typedef char DataType; typedef struct { DataType data[StackSize]; int top; } SeqStack; 栈底位置可设置在向量两端的任意一个端点。 栈顶指针和栈中元素之间的关系: 当栈中没有元素时(空栈),top=-1; 当栈中放满元素时(栈满),top=m-1, m为栈的最大容量; 当插入元素时,先使指针top增1,再插入; 当删除元素时,先使指针top减1,再删除; 上溢:当栈满时再做进栈运算所产生的空间溢出。(出错状态) 下溢:当栈空时再做退栈运算所产生的溢出。(正常现象,程序控制转移的条件) 在顺序栈上实现栈的六种基本运算 1、将顺序栈置空: void InitStack(SeqStack *S) { S-top=-1; } 2、判栈空 int StackEmpty (SeqStack *S) { return S-top==-1; } 3、判栈满 int StackFull (SeqStack *S) { return S-top==StackSize-1; } 4、进栈 void Push (SeqStack *S, DataType x) { if (StackFull(S)) { printf(“Stack overflow”); exit(0);} S-data[++S-top]=x; } 5、退栈 DataType Pop (Seqstack *S) { if (StackEmpty(S)) { printf(“Stack underflow”); exit(0); } return S-data[s-top--]; 6、取栈顶元素 DataType StackTop (SeqStack *S) { if (StackEmpty(S)) { printf(“Stack is empty”); exit(0); } return S-data[S-top]; } 链栈:栈的链式存储结构称为链栈。    链栈是运算受限的单链表,它的插入和删除被限制在表头位置上进行。栈顶指针就是链表的头指针,它唯一确定一个链栈。 链栈上实现的基本运算:    置空栈        判栈空        进栈        退栈     取栈顶元素     队列 一、队列的定义 队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(Front),允许插入的一端称为队尾(Rear)。   队列的修改是按先进先出的原则进行的。因此,队列又称为先进先出(First In First Out)的线性表,简称为FIFO表。 二、队列的基本运算  1、InitQueue(Q) 置空队。构造一个空队列Q。    2、QueueEmpty(Q) 判队空。若队列Q为空,则返回真值,否则返回假值。    3、QueueFull(Q) 判队满。若队列Q为满,则返回真值,否则返回假值。此操作只适用于队列的顺序存储结构。    4、EnQueue(Q,x) 若队列Q非满,则将元素x插入Q的队尾。此操作简称入队。    5、DeQueue(Q) 若队列Q非空,则删去Q的队头元素,并返回该元素

文档评论(0)

1亿VIP精品文档

相关文档