小心这些“坑爹”的育儿知识



《小心这些“坑爹”的育儿知识》由会员分享,可在线阅读,更多相关《小心这些“坑爹”的育儿知识(60页珍藏版)》请在文档大全上搜索。
1、1第3章 栈和队列要求:了解栈的定义及特点,掌握栈表示和实现,重点是栈初始化、判断栈空和栈满、出栈和入栈操作;(注意栈顶的约定)栈的应用举例,重点是表达式求值;(了解波兰式、逆波兰式、中缀式等概念)栈与递归的实现;(系统工作栈)了解队列的定义及特点,掌握队列的表示和实现,重点是队列初始化、判断队空和队满、出队和入队操作;难点:循环队列。(离散事件模拟不要求) 育儿知识 http:/www.pangbaba.cc2第3章 栈和队列栈和队列是两种特殊的线性表,是操作受限的线性表,称限定性DSn3.1 栈(stack)n栈的定义和特点 定义:限定仅在表尾进行插入或删除操作的线性表,表尾栈顶top,表
2、头栈底bottom,不含元素的空表称空栈 特点:先进后出(FILO)或后进先出(LIFO)ana1a2.栈底栈顶.出栈进栈栈s=(a1,a2,an)进栈插入元素出栈删除元素抽象数据类型定义3n栈的表示和实现 顺序栈 一维数组sM 或先分配一个基本容量,逐段扩大,动态数组top=0123450栈空栈顶指针top,指向实际栈顶后的空位置,初值为0base保持不变top123450进栈Atop出栈栈满BCDEF设数组维数为Mtop=0,栈空,此时出栈,则下溢(underflow)top=M,栈满,此时入栈,则上溢(overflow)toptoptoptoptop123450ABCDEFtoptopt
3、optoptoptop栈空4typedef struct SElemType *base; /保持不变,NULL 不存在栈SElemType *top; /栈顶,指向不用(空)元素,与定义不同int stacksize;SqStack; /(进)入栈 top+,出(退)栈 top-算法描述InitStack, DestroyStack, ClearStack,StackEmpty, StackLength, GetTop,Push, Pop,StackTraverse5构造一个空栈SStatus InitStack(SqStack &S) S.base = (SElemType *)m
4、alloc(STACK_INIT_SIZE * sizeof(SElemType); if (!S.base)exit(OVERFLOW); /存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK;取栈顶元素Status GetTop(SqStack S, SElemType &e) if (S.top = S.base) return ERROR; e = *(S.top-1); return OK;6入栈算法Stutas Push(SqStack &S, SElemType e) if (S.top
5、S.base = S.stacksize S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; *S.top+ = e; /先赋值,再加指针 return OK;7出栈算法Status Pop (SqStack &S, SElemType &e) if (S.top = S.base)
6、return ERROR; e = *-S.top; /先减指针,再取值 return OK;0M-1栈1底栈1顶栈2底栈2顶在一个程序中同时使用两个栈8 链栈栈顶 .topdata link栈底 结点定义 入栈算法 出栈算法typedef struct node int data; struct node *link;JD; .栈底toptopxptop .栈底topq93.2 栈的应用举例数制转换 N (N div d)x d + N mod d算法 3.1 P48计算过程 入栈打印过程 出栈例 把十进制数159转换成八进制数(159)10=(237)815981982802 3 7 余
7、7余 3余 2toptop7top73top73210void conversion (int Num) / 算法3.1 / 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 InitStack(S); / 构造空栈 while (Num) Push(S, Num % 8); Num = Num/8; while (!StackEmpty(S) Pop(S,e); printf (%d, e); printf(n); / conversion11括号匹配的检验 园、方、花括号 嵌套匹配回文游戏:顺读与逆读字符串一样(不含空格)dadtop1.读入字符串2.去掉空格(原串)3.压入栈
8、4.原串字符与出栈字符依次比较 若不等,非回文 若直到栈空都相等,回文字符串:“madam im adam”12void LineEdit( ) InitStack(S); ch=gether( ); while(ch!=EOF) while(ch!=EOF & ch!=n) switch(ch) case # : Pop(S,c); case : ClearStack(S); default : Push(S,ch); ch=getchar( ); transfer; ClearStack(S); if(ch!=EOF) ch=gethar( ); DestroyStack(S);简
9、单行编辑程序 逐行存入,退格 , 清行 算法 3.2 P50迷宫求解,地图四染色13(1)(2)(4)(5)(6)(7)(3) 地图四染色问题R 7 7 1 2 3 4 5 6 71 2 3 4 5 6 7 1 0 0 0 0 1 00 1 1 1 1 1 01 0 1 0 1 1 01 0 1 1 0 1 01 1 0 1 1 0 01 0 0 1 1 0 00 0 0 0 0 0 01 2 3 4 5 6 7 122 3414334231# 紫色紫色 2# 黄色黄色3# 红色红色4# 绿色绿色14n表达式求值 运算规则 中缀表达式 后缀表达式(RPN) a*b+c ab*c+ a+b*c
10、abc*+ a+(b*c+d)/e abc*d+e/+中缀表达式:操作数栈和运算符栈 P53表3.1优先关系例 计算 2+4-3*6操作数运算符24+操作数运算符6-操作数运算符6-36*操作数运算符6-18操作数运算符-1215算法基本思想 P531)操作符栈 OPTR的栈底元素为表达式起始符 #,操作数栈 OPND为空2)依次读入字符:是操作数则入OPND栈,是操作符则要判断算法 3.4注意未考虑匹配,表达式必须正确表达式的前缀、中缀、后缀表示,其中表达式的前缀表示称为波兰式,表达式的后缀表示称为逆波兰式RPN (Reverse Polish Notation)。由于逆波兰式用的较多,习惯
11、上称为波兰式 。中缀表达式 算符优先法,括号,双堆栈前、后缀表达式 单堆栈,算符无优先级,无括号中缀 后缀16OperandType EvaluateExpression( ) / 算法3.4 算术表达式求值的算符优先算法。 / 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。 InitStack (OPTR); Push (OPTR, #); InitStack (OPND); c = getchar(); while (c!= # | GetTop(OPTR)!= #) if (!In(c, OP) Push(OPND, c); c=getchar(); / 不是运算符则进