2026/2/14 17:37:37
网站建设
项目流程
wordpress域名设置,做搜狗pc网站优化,网站运营工作内容,低代码开发公众号一、 栈 (Stack)#xff1a;最后进#xff0c;最先出栈是仅限在栈顶#xff08;Top#xff09;进行插入或删除操作的线性表。其核心特性是 LIFO (Last In First Out)。1. 顺序栈的指针含义在 C 语言实现中#xff0c;top 指针的定义至关重要。习惯定义#xff1a;top 指向…一、 栈 (Stack)最后进最先出栈是仅限在栈顶Top进行插入或删除操作的线性表。其核心特性是LIFO (Last In First Out)。1. 顺序栈的指针含义在 C 语言实现中top指针的定义至关重要。习惯定义top指向栈顶元素的下一个位置。空栈条件S.top S.base。满栈条件S.top - S.base S.stacksize。2. 核心算法入栈与出栈// 入栈 (Push) Status Push(SqStack S, ElemType e) { if (S.top - S.base S.stacksize) return ERROR; // 满栈 *S.top e; // 先把 e 放入 top 指向的位置然后 top 指针自增 1 return OK; } // 出栈 (Pop) Status Pop(SqStack S, ElemType e) { if (S.top S.base) return ERROR; // 空栈 e *--S.top; // top 先减 1 指向栈顶元素再取出赋值给 e return OK; }二、 栈的顶级应用括号匹配 (Parenthesis Matching)这是一个典型的“后进先出”场景最后出现的左括号必须最先被匹配掉。算法精髓遇到左括号它是期待被匹配的先“存”起来 ——压栈。遇到右括号它来寻找匹配对象找谁找最近出现的那个左括号 ——弹出栈顶检查。匹配失败的三种情况遇到右括号但栈已空右括号多余。弹出的左括号与当前右括号不匹配如[与)。遍历结束但栈不为空左括号多余。三、 队列 (Queue)先进先出公平至上队列是只允许在队尾 (Rear)插入、队头 (Front)删除的线性表。其特性是FIFO (First In First Out)。1. 循环队列 (Circular Queue)解决“假溢出”在顺序存储下随着出队入队指针会一直向后移动直到超出界限。为了重复利用空间我们将数组想象成一个“环”。核心公式利用模运算%。指针后移i (i 1) % MAXSIZE;2. 难点如何区分队空还是队满当front rear时队列可能空也可能满。严版教材方案牺牲一个单元。队空Q.front Q.rear。队满(Q.rear 1) % MAXSIZE Q.front。队列长度计算高频考点(Q.rear - Q.front MAXSIZE) % MAXSIZE。四、 深度复盘递归与栈的灵魂绑定很多初学者不理解为什么递归需要栈。详细注释当一个函数调用者调用另一个函数被调用者时系统必须保存调用者的“断点”信息局部变量、返回地址等。这些信息被压入系统栈。被调用者执行完后从栈顶弹出信息恢复调用者。递归就是一种特殊的嵌套调用它不断地把每一层的信息压栈。如果递归没有出口栈就会被撑爆产生著名的Stack Overflow错误。五、 今日对比小结结构逻辑规则插入/删除位置典型应用栈LIFO都在栈顶括号匹配、表达式求值、递归队列FIFO队尾入、队头出打印机任务、缓冲区、BFS(广搜)今日踩坑提醒顺序栈Pop时指针是先自减还是先取值一定要看top的初始定义。循环队列的MAXSIZE并不是实际能存的元素个数如果采取“牺牲一个单元”法只能存MAXSIZE - 1个。明日预告第四章 串——深入浅出 KMP 算法彻底搞定next数组推导