当前位置: 首页 > wzjs >正文

怎么做网站 教学头条今日头条

怎么做网站 教学,头条今日头条,百度惠生活小程序,平顶山市建设委员会网站一、核心问题:表达式求值的难点 对于像 3*(7-2)# 这样的表达式,直接计算会面临 “运算顺序” 的问题: 先算括号里的 7-2,还是先算乘法?如何处理运算符的优先级(乘除高于加减)?如何匹…

一、核心问题:表达式求值的难点

对于像 3*(7-2)# 这样的表达式,直接计算会面临 “运算顺序” 的问题:

  • 先算括号里的 7-2,还是先算乘法?
  • 如何处理运算符的优先级(乘除高于加减)?
  • 如何匹配括号(括号内的要优先计算)?

栈的作用就是 “管理运算顺序”

  • 用两个栈:
    • OPND 栈:存操作数(如 372 )和中间结果(如 515 )。
    • OPTR 栈:存运算符(如 *(- )和边界符(如 # )。
  • 通过 “比较运算符优先级”,决定是 “压栈等待” 还是 “弹出计算”。

二、关键规则:算符优先关系表

 

这张表是 “指挥中心”,决定运算符的优先级:

  • 表格里的 θ₁ 是 栈顶运算符θ₂ 是 当前扫描到的运算符
  • 比较结果:
    • <:当前运算符优先级更高 → 压入 OPTR 栈,等待后续计算。
    • >:栈顶运算符优先级更高 → 弹出栈顶运算符,从 OPND 取数计算。
    • =:括号匹配(如 ( 和 ) 相遇),弹出栈顶的 (,继续扫描。

举个简单例子:

  • 栈顶是 +θ₁),当前运算符是 *θ₂):查表格,+ 和 * 的交叉是 < → * 优先级更高,* 压栈。
  • 栈顶是 *θ₁),当前运算符是 +θ₂):查表格,* 和 + 的交叉是 > → * 优先级更高,先弹出 * 计算。

三、算法步骤(结合图片里的流程)

以 3*(7-2)# 为例,完整走一遍流程:

1. 初始化
  • OPTR 栈压入 #(作为表达式的 “起始边界符”)。
  • OPND 栈为空。
  • 扫描指针指向表达式第一个字符 '3'
2. 循环处理(直到扫描到 # 且栈顶也是 #

核心逻辑

  • 遇到 操作数(如 372 )→ 压入 OPND 栈。
  • 遇到 运算符(如 *(- )→ 查 “优先关系表”,决定是 “压栈” 还是 “计算”。

逐步演示

步骤扫描字符 ch操作说明
1'3'压入 OPND 栈OPND: [3]OPTR: [#]
2'*'比较 OPTR 栈顶 # 和 * → <* 压入 OPTR 栈 → OPTR: [#, *]
3'('比较 OPTR 栈顶 * 和 ( → <( 压入 OPTR 栈 → OPTR: [#, *, (]
4'7'压入 OPND 栈OPND: [3, 7]
5'-'比较 OPTR 栈顶 ( 和 - → <- 压入 OPTR 栈 → OPTR: [#, *, (, -]
6'2'压入 OPND 栈OPND: [3, 7, 2]
7')'比较 OPTR 栈顶 - 和 ) → >弹出 -,计算 7-2=5,结果压入 OPND → OPND: [3, 5];然后比较栈顶 ( 和 ) → =,弹出 (
8'#'比较 OPTR 栈顶 * 和 # → >弹出 *,计算 3*5=15,结果压入 OPND → OPND: [15]
9'#'扫描结束,返回 OPND 栈顶结果 15
3. 终止条件

当扫描到 #,且 OPTR 栈顶也是 # 时,循环结束,OPND 栈顶就是最终结果。

四、代码逻辑解析(结合图片里的函数)

以下是核心函数的逻辑拆解(对应图片里的 EvaluateExpression 函数):

1. 初始化栈
InitStack(OPTR); Push(OPTR, '#'); // OPTR 栈初始化,压入 #
InitStack(OPND); ch = getchar();  // OPND 栈初始化,读第一个字符
2. 循环处理表达式
while (ch != '#' || GetTop(OPTR) != '#') { // 没扫描完或栈顶不是 #if (!In(ch)) { // ch 不是运算符 → 压入 OPNDPush(OPND, ch); ch = getchar(); } else { // ch 是运算符 → 比较优先级switch (Precede(GetTop(OPTR), ch)) { case '<': // 当前运算符优先级高 → 压栈Push(OPTR, ch); ch = getchar(); break;case '>': // 栈顶运算符优先级高 → 弹出计算Pop(OPTR, theta); // 弹出运算符Pop(OPND, b); Pop(OPND, a); // 弹出两个操作数Push(OPND, Operate(a, theta, b)); // 计算后压入结果break;case '=': // 括号匹配 → 弹出 (,继续扫描Pop(OPTR, x); ch = getchar(); break;}}
}
3. 返回结果
return GetTop(OPND); // OPND 栈顶就是结果

五、关键函数说明

  1. In(ch):判断 ch 是否是运算符(+-*/()# )。
  2. Precede(θ₁, θ₂):查 “优先关系表”,返回 <> 或 =
  3. Operate(a, theta, b):执行运算(如 a + ba * b ),注意顺序(a 是栈底的数,b 是栈顶的数,比如 7-2 中 a=7b=2 )。

六、总结

栈在表达式求值中的核心作用是 “管理运算顺序”

  • 用 OPTR 栈 “暂缓” 低优先级的运算符,保证高优先级的先计算。
  • 用 OPND 栈存操作数和中间结果,随时弹出参与计算。
  • 整个过程靠 “算符优先关系表” 指挥,实现自动遵循 “先乘除后加减、先括号内后括号外” 的规则。
http://www.dtcms.com/wzjs/282970.html

相关文章:

  • 烟台电子商务产业园网站建设广告优化师的工作内容
  • 动态网站项目实训教程任务3怎么做哪个平台推广效果好
  • 知识库wordpressseo优化人员
  • 江门网站制作套餐企业策划方案怎么做
  • 网站建设程序做哪些在线客服系统平台有哪些
  • shopex网站 css乱了淮北seo排名
  • 莱芜搜狗推广提供seosem是指什么意思
  • 大学生创新创业网站开发电商卖货平台有哪些
  • 北京做网站建设价格百度网站怎么做
  • 深圳做地铁的公司网站发软文的网站
  • 唐山网站建设优化网页设计制作网站模板图片
  • 普陀做网站价格seo优化专员工作内容
  • 网站建设中的端口泰安seo网络公司
  • 电商网站可以用dw做网上哪里接app推广单
  • 凡客网站登录seo教程自学网
  • 收录网址教程衡阳seo优化
  • 驻马店网站建设企业推广是什么意思
  • 衡水移动端网站建设网站seo完整seo优化方案
  • 建设网站培训学校杭州龙席网络seo
  • 泰安手机网站建设公司互联网营销推广怎么做
  • 网站开发课程教学目标网络服务主要包括什么
  • 大理建设招标有限公司网站深圳网站建设推广优化公司
  • 武汉高端网站开发公司论文收录网站排名
  • wordpress 萌主题网站建设优化400报价
  • 网站设计模板照片网站优化技巧
  • 直播网站模板免费网页制作平台
  • 平台类网站做多久南宁网
  • 网络营销案例实例优化防控举措
  • 高端营销网站定制简述常用的网络营销方法
  • 移动终端的网站百度竞价排名是什么