栈、队列和数组__栈.pptVIP

  • 5
  • 0
  • 约2.74千字
  • 约 26页
  • 2018-10-11 发布于安徽
  • 举报
第3章 栈、队列和数组 3.1 栈 一、栈的定义和运算 1、定义: 栈(Stack): 是只能在一端插入和删除的线性表。 一、栈的定义和运算-术语 下面介绍有关栈的术语: 一、栈的定义和运算-运算 3、栈的基本运算 (1)初始化栈:init_stack(S); (2)判栈空:stack_empty(S); (3)读栈顶元素:stack_top(S,x); (4)入栈:push_stack(S,x); (5)出栈:pop_stack(S); (6)判栈满:stack_full(S); 二、顺序栈 1、存储结构: ——采用顺序表来存储的栈; typedef struct {elementtype data[maxsize]; int top; } seqstack; 引用:seqstack S; 二、顺序栈-图例 下图即为一个顺序栈: 二、顺序栈-图例 如图所示: 二、顺序栈-运算的实现 2、运算的实现 : (1)初始化: void init_stack(seqstack * S) {S-top=-1;} (2)判栈空: BOOL stack_empty(seqstack S) {if (S.top==-1) return TRUE; else return FALSE; } 二、顺序栈-运算的实现入栈 (3)入栈: void push_stack(seqstack *S, elementtype x) { if(S-top==maxsize-1) error(“溢出”); else S-data[++S-top]=x ; } 二、顺序栈-运算的实现出栈 (4)出栈: void pop_stack(seqstack *S,elementtype x); { if(S-top==-1) error(“栈空”); else x=S-data[S-top--]); } 三、链栈—采用链表存储的栈 三、链栈 链栈结构图: 入栈 链栈入栈: 出栈 链栈出栈: 四、栈的应用 1、栈的基本应用实例: 设栈的输入序列依次为1,2,3,4,则所得的输出序列不可能是________ 。 a 1,2,3,4 b 4,2,3,1 c 1,3,2,4 d 3,4,2,1 四、栈的应用- 2 2、表达式的计算: 模拟表达式:12+*6-4/2的求解过程。 四、栈的应用- 2 2、表达式的计算: 运算符优先级比较: ‘* /’ ‘+ -’ ‘#’ 四、栈的应用- 2 如上例: 四、栈的应用- 2 最终结果: 四、栈的应用- 3 3、递归与递归的阅读: (1)递归的定义: 如果一个函数直接或间接地调用自己,则称之为递归函数。 四、栈的应用- 3 (2)递归的一般形式: void fname(参数表) { if(数据作为递归出口) 简单操作; else{简单操作; fname(参数表);简单操作; [fname(参数表);简单操作;] //可能有多次调用 } } 四、栈的应用- 3 (3)递归的阅读: 四、栈的应用- 3 如果例子里的程序略做变化: 四、栈的应用- 3 void p(int n) { if(n0) { p(n-1); coutn; p(n-1); } } * * 2、特点:后进先出(LIFO)。 … an a2 a1 入 出 …… an-1 an a2 a1 入栈 出栈 栈顶 栈底 top a1 a2 a3 a4 … an data top seqstack 注意:(1)top==-1时栈为空; (2)栈顶元素是data[top] a2 a3 a1 top 3 2 1 0 -1 3 2 1 0 -1 top 空栈 栈顶元素为a3 a2 a3 a1 3 2 1 0 -1 top x a2 a3 a1 3 2 1 0 -1 top a3 top an an-1 a2 a1 ^ a1 a2 a3 a4 ^ top x P × a1 a2 a3 a4 ^ top × 例 4 3 2 1 ? b 例 运算符 操作数 #12+5*6-4/2# 操作数运算符各自依次入栈。 入栈规则:当前入栈的运算符

文档评论(0)

1亿VIP精品文档

相关文档