B/S项目结束,又是一个新的开始

作者回顾了历时八个月的B/S项目学习过程,从牛腩新闻发布系统到JavaScript等技术的学习,分享了时间管理、学习方法、内容总结等方面的体会,并提出了对自身学习习惯的反思。文章强调了理论知识与实践结合的重要性,以及使用工具如今目标进行有效学习管理的作用。
    在软考后,B/S项目也结束了。从今年的三月份,到现在的十一月份,历时八个月,期间有过因为合作、参与项目、软考等方面原因中断,而原本计划在半年完成的项目用了八个月。
    学习完B/S项目,看着今目标上一个大项下完成了一个个的小项,好像收获很多,但自己总是觉得学习过后,什么也没有留下,对于B/S模式下的开发,我还处于一片茫然的状态。对于技术知识的总结,已经写过一篇博客,《我的第100篇优快云博客》。这一篇博客,主要是对自己的学习管理、方法、态度、思想等方面进行一个反省。
    从最开始的牛腩新闻发布系统说起,记忆中应该是用了四十多天,比计划上的要慢了十多天。那时候,正好是作品展,也有自学考试,然而自己还是想着必须要先把它完成。所以,那时候,徒弟准备自己的作品,也没有好好给予指导;自己的自学考试,也没有好好准备;到最后,牛腩的重点技术真假分页,自己也没有好好总结。
    后面的学习项目,花了一个月的时间在机房合作中,五月份中旬才继续的后面的项目学习。HTML、ASP.NET和XML,比较简单,视频也很简短,不用再准备考试,也没有其他干扰,很顺利的完成了一个又一个项目。
    150集的JavaScript,在自己还没有学习到的时候,就已经听其他人说了,看着很费劲,很无聊。但毕竟是一个大项,自己还是要学下去的。在七八月份的暑假,一直参与着项目,也只能是偶尔学习视频内容。
    到八月底,JavaScript后面一半的内容自己都是加速看了一遍,整个实例自己也没有去实践。对于这部分的学习资料,学完后,越是到后面,也觉得和其他人有着同样的感觉,无聊,不想学。
     趁着还没有开始准备软考,把简单的CSS+DIV学习结束了。这个项目的学习,让自己想到了第一年学习的VB百例,都是一个个很简单的例子,但自己亲手去做感觉就很不一样了。也正是因为这个项目的学习,才发现其实我们生活中平常用到的很多实例、浏览网页时看到的很多效果,都是用它们就可以实现的。
    九月初,我们开始了备战软考,所以向师父申请了暂停B/S项目,打算一心一意准备软考。而十月初的师徒会议,让自己改变了这样的做法。其实软考备战期间,还是可以留有很多空闲时间的。这时候,完全可以继续B/S项目后面的学习视频。如果没有软考的话,可能是一天一集,而因为软考,隔一天看一集也是很明智的选择。所以,软考过后,自己的B/S项目也紧接着就结束了。
    现在回想起来,B/S学习的这一路,好漫长呐。学习期间,也没有发现自己有什么问题,光是想着走完这一个项目,继续下一个项目就好。但现在想想,学习上还是存在不少的毛病需要改正。
    【计划执行】
     自己做的还行,因为有了今目标这样一个工具,让自己的每个学习阶段都很会很有计划地进行下去。每个阶段,每个项目,如果没有什么特殊的事冲突,自己一般都能够在计划的时间内完成。
    【时间管理】
     一个人的时间管理得好,不仅仅是看他是否完成了这一段时间内应该完成的某一项任务,而应该是看这段时间内,是否把几件事同时都处理的很好。而这一点,自己并没有做好,很多时候,都会只注重一件事,而往往忽略其他的几件事。每次到了重要紧急的时刻,才想着该处理它了。
    【学习方法】
     这部分的学习主要都是视频的学习,而我们应该怎么做才能使得这样的视频学习内容高效。刚来提高班的时候,那时候学习陈伟视频,看的时候很认真的做笔记,恨不得把视频的每一句话,每一个字都写在笔记里,这样既没有了效率,又浪费了时间。所以,现在看视频的学习资料,都会使用截屏的方法,自己再用几个词总结一下,也会写写自己的一些想法。
    【学习内容】
     其实,这个项目中一个牛腩新闻发布系统就把很多技术都用上了,有了这样一个系统的实践,后面的学习也就简单了很多,至少自己前后能产生共鸣。大体上,学习完每一个资料后,自己都会觉得又掌握了一门新的技术。但因为自己实践得太少,后面的视频学习中实例敲得不多,也导致自己不知道该如何去应用。
    【学习总结】
     不论是哪一个阶段的学习,自己都会写各阶段的总结博客,一篇对新技术的宏观认识是必不可少的。从这两年的学习看来,自己也发现时刻总结,颗粒归仓可以帮助我们很多,也可以让我们轻松不少。对于那么多的知识与技术,难免会忘记,难免会不知道该怎么去应用,但只要想想当时总结的图或者思路,这也很大程度上帮助了自己拾起。
    【新的开始】
    结束,意味着又是一个新的开始。这么长的时间,积累了很多理论知识,而真正意义上的项目,也已经来到我的世界里,我也会继续努力~
<think>我们需要将中缀表达式(a+b)*c/d转换为逆波兰表达式(后缀表达式)逆波兰表达式的特点:运算符在操作数后面,需要括号,利用栈结构可以实现转换转换算法(调度场算法)步骤:1.初始化一个操作符栈和一个输出列表(存储逆波兰表达式)2.从左到右扫描中缀表达式:如果遇到操作数(如a,b,c等),直接输出到列表。如果遇到左括号,压入栈中。如果遇到右括号,则断弹出栈顶操作符并输出,直到遇到左括号(左括号弹出但输出)。如果遇到运算符:当栈非空且栈顶操作符优先级大于等于当前操作符时,弹出栈顶操作符并输出(循环直到条件满足);然后将当前操作符压入栈中。3.表达式扫描结束后,将栈中剩余操作符依次弹出并输出。运算符优先级:乘除(*、/)优先级相同,加减(+、-)优先级相同,乘除优先级高于加减。对于表达式(a+b)*c/d:步骤:1.遇到'(',压栈。2.遇到a,输出:当前输出列表为[a]。3.遇到'+',压栈(此时栈顶为'(',注意'('在栈内时,其优先级最低,所以直接将'+'压栈)。4.遇到b,输出:[a,b]。5.遇到')',弹出运算符直到'(':弹出'+'并输出,然后弹出'('(输出)。此时输出列表为[a,b,+]。6.遇到'*',因为栈为空,所以直接压栈。7.遇到c,输出:[a,b,+,c]。8.遇到'/',这时栈顶是'*',优先级与'/'相同(或大于)?根据优先级相同,且满足从左到右结合,因此先弹出'*'并输出,然后再将'/'压栈。(注意:我们处理相同优先级时,也是要弹出,因为同优先级从左到右计算)所以,弹出'*',输出变为[a,b,+,c,*],然后将'/'压入栈中。9.遇到d,输出:[a,b,+,c,*,d]。10.表达式结束,将栈中运算符依次弹出:弹出'/'并输出,最终输出列表为[a,b,+,c,*,d,/]因此,逆波兰表达式为:ab+c*d/但是,我们再看一下表达式:先计算(a+b)得到中间结果,然后乘以c,再除以d。逆波兰表达式:ab+c*d/表示:((a+b)*c)/d然而,我们也可以通过调整运算符顺序来验证:另一种可能:ab+cd/*表示:(a+b)*(c/d)显然对,因为原表达式是(a+b)*c再除以d。因此,上面的转换结果是正确的。但是,我们上面的步骤第8步中,栈顶是'*',当前操作符是'/',由于乘除优先级相同,所以先弹出栈顶的'*',然后再压入'/'。然后最后输出时,'/在最后,所以先算乘法再算除法。所以最终逆波兰表达式是:ab+c*d/注意:有时候我们会将逆波兰表达式写成字符串,所以结果可以是:ab+c*d/或者用空格分隔:"ab+c*d/"引用说明:逆波兰表达式又称后缀表达式,它需要括号,且运算符的位置在操作数之后[^1][^2]。因此,我们给出转换方法:1.使用栈来存储运算符。2.按照运算符优先级和结合性进行栈操作。针对这个表达式,我们详细步骤:输入:(a+b)*c/d步骤:1.'('->压栈:栈:['(']输出:[]2.'a'->输出:输出:['a']3.'+'->与栈顶'('比较,由于'('在栈内时,栈顶运算符优先级低于任何新运算符,所以压栈:栈:['(','+']输出:['a']4.'b'->输出:输出:['a','b']5.')'->弹出栈直到'(':弹出'+'并输出,然后弹出'('(丢弃)。输出:['a','b','+']栈:[]6.'*'->栈空,压栈:栈:['*']输出:['a','b','+']7.'c'->输出:输出:['a','b','+','c']8.'/'->栈顶是'*',优先级与'/'相同(根据从左到右原则,先处理栈顶),所以弹出'*'并输出,然后压入'/':输出:['a','b','+','c','*']栈:['/']9.'d'->输出:输出:['a','b','+','c','*','d']10.结束:弹出栈中所有运算符:弹出'/'并输出:输出:['a','b','+','c','*','d','/']所以结果是:ab+c*d/也可以写成:ab+c*d/(注意,这是一个字符串,用空格分隔每个元素)注意:在实际程序中,操作数和运算符之间需要空格分隔,这里我们按空格分隔来写。因此,答案就是:ab+c*d/验证:根据引用[3]中给出的逆波兰表达式求值方法,我们计算:((a+b)*c)/d步骤:遇到操作数压栈,遇到运算符弹出两个操作数,计算,压栈。1.a->压栈[a]2.b->压栈[a,b]3.+->弹出b,a,计算a+b得到结果s,压栈[s]4.c->压栈[s,c]5.*->弹出c,s,计算s*c得到结果t,压栈[t]6.d->压栈[t,d]7./->弹出d,t,计算t/d得到结果u,压栈[u]正是我们想要的运算顺序。因此,转换正确。注意:由于原表达式是((a+b)*c)/d,我们的转换结果完全表达了这一运算顺序。引用:逆波兰表达式需要括号,并且运算符的顺序已经隐含了运算优先级[^1][^4]。所以最终答案:逆波兰表达式为:ab+c*d/</think> ### 如何将中缀表达式`(a+b)*c/d`转换为逆波兰表达式 #### 逆波兰表达式的特点 逆波兰表达式(后缀表达式)将运算符置于操作数之后,无需括号即可明确计算顺序[^1][^2]。例如: - 中缀表达式 `1.3 * 2 + (5.1 - 3.6 / 2) * 4` - 等价逆波兰表达式:`1.3 2 * 5.1 3.6 2 / - 4 * +`[^3] #### 转换步骤(调度场算法) 以下是使用**运算符栈法**将中缀表达式`(a+b)*c/d`转换为逆波兰表达式的详细过程: 1. **初始化** - 运算符栈:空栈 - 输出列表:空(用于存放结果) 2. **扫描字符 `( `** - 左括号直接入栈:`栈:[(]` 3. **扫描字符 `a`** - 操作数直接加入输出列表:`输出:[a]` 4. **扫描字符 `+`** - 栈顶 `(` 优先级低于 `+`,入栈:`栈:[(, +]` 5. **扫描字符 `b`** - 操作数加入输出:`输出:[a, b]` 6. **扫描字符 ` )`** - 弹出运算符直到 `(`:`弹出并输出:+`,`弹出:((丢弃)` - 输出变为:`[a, b, +]` 7. **扫描字符 `*`** - 栈空直接入栈:`栈:[*]` 8. **扫描字符 `c`** - 操作数加入输出:`输出:[a, b, +, c]` 9. **扫描字符 `/`** - 栈顶 `*` 优先级等于 `/`,弹出并输出 `*` - 将 `/` 入栈:`输出变为:[a, b, +, c, *]`,`栈:[/]` 10. **扫描字符 `d`** - 操作数加入输出:`输出:[a, b, +, c, *, d]` 11. **处理剩余栈元素** - 弹出所有运算符:`输出最后添加 /` - 最终输出:`[a, b, +, c, *, d, /]` **最终结果**: `a b + c * d /` #### 计算顺序验证 使用栈计算该逆波兰表达式: 1. 遇到操作数压栈:`栈:[a, b]` 2. 遇到 `+`:弹出 `b, a`,计算 `a+b` → 结果压栈 3. 遇到 `c`:压栈 4. 遇到 `*`:弹出 `c, (a+b)` → 计算 `(a+b)*c` → 结果压栈 5. 遇到 `d`:压栈 6. 遇到 `/`:弹出 `d, ((a+b)*c)` → 计算 `((a+b)*c)/d` 完全符合原表达式`((a+b)*c)/d`的语义[^3][^4]。 #### 关键规则总结 1. **运算符优先级**:乘除(`*`,`/`)> 加减(`+`,`-`) 2. **括号处理**:左括号入栈;右括号触发弹出直至遇到左括号 3. **同优先级处理**:从左到右顺序(需弹出前一个运算符) 4. **操作数处理**:直接输出到结果列表 > 逆波兰表达式通过运算符位置隐含计算顺序,彻底消除二义性[^1][^4]。 ```text 中缀: (a+b)*c/d 后缀: a b + c * d / ✅ ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值