0%

leetcode栈专题

顺序栈的定义

顺序栈栈和线性表很类似,可以认为栈是一种特殊的线性表,只是插入和删除只能允许在其一端进行,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。

栈插入的元素将第一个被删除,栈也称为后进先出(Last In First Out,LIFO)或先进后出(First In Last Out FILO)的线性表。

栈的操作

  • peek(未删除只获取值)
  • push(入栈,更新栈顶Top指向)
  • Pop(出栈,删除并获取值,更新栈顶Top指向)

链式栈

空栈

Read more »

leetcode队列专题

队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的特点就是先进先出(First In First Out)。

顺序队列

建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

如果没有两个指针,入队操作直接执行顺序表尾部插入操作,其时间复杂度为O(1),出队操作直接执行顺序表头部删除操作,其时间复杂度为O(n),
增加了front和rear指针,出队操作的时间复杂度也是O(1)了。

空队列:

往队列里面插入A:

继续插入元素:

将A和B出队:

继续将D、E、F、G入队:

由于队列暂时”已满”,G将无法入队,但是此时front前面实际上还有未被利用的空间,这称为"假上溢"现象
之所以出现这样”假溢出”现象是因为顺序表队列的存储单元没有重复利用机制,而解决该问题的最合适的方式就是将顺序队列设计为循环结构。

“下溢”现象

当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。

“真上溢”现象

Read more »

这篇笔记摘选自张满胜老师的《英语语法新思维中级教程通悟语法第2版》,以及其他网上知识点收集,只是我自己的个人复习笔记,禁止转载,如有侵权,请联系我删除。
思维导图版本点击这里(Web版的XMind有一些问题)。

多情多义的情态动词

情态动词的“全家福”


需要注意的是,四个情态动词的过去式could,might,would和should只是在形式上是can,may,will和shall的过去式,而在意义上并不是完全对应于can,may,will和shall。
一方面,现在式和过去式这两类情态动词的意义并不完全对等。例如,can和could的意义并不完全等同,它们既有共同的用法,如表示“能力”,也有各自不同的用法。另一方面,这四个过去形式的情态动词并不一定表示过去的时间(实际上通常都不是)。

情态动词的意义

情态动词(modals)用在实义动词(main verb)的前面, 以添加某种意思。比较下列句子用与不用情态动词在意义上的差别:
1) John isn’t in class. He is sick.
2) John isn’t in class. He must be sick.
在例句1)中,没有使用情态动词,只用了一般现在时态的is,表达的是一个客观事实。在例句2)中,用了情态动词must,则是表示说话人的主观猜测。我们看到,因为有了must,使得例句2)比例句1)更带有主观色彩,意思也不同了。
1) 约翰今天没上课,他病了。
2) 约翰今天没上课,他一定是病了。

I must go to school today.
比较上面的例句2)和本句可以发现,两句中情态动词must的意思是不一样的:例句2)中的must表示推测,而本句中的must没有推测的意思,而是表示“必须”。
今天我一定得上学去。

有时,即使是同一个句子,也可能会因为语境不同,其中的情态动词会有不同的理解。
He must drink a lot of milk.
没有上下文的语境,我们很难判断。即比如,如果这句话是出自医生之口,显然就会被理解成是医生对病人提的一个忠告或建议,即“他得多喝牛奶”。言外之意,就是说明喝牛奶对健康是有好处的。因此,此时的must是“必须”之意。我们再想象这句话可能出现的另一个场景,比如,有一天我们在商店里看到一个人买了很多牛奶,这时我们就可以推断说“He must drink a lot of milk”。
显然这时要说的意思是“他准是爱喝很多牛奶”。因此,此时的must表示的是推测。
情态动词的含义大致可以分为以下两大类:

  • 一类是表示“逻辑可能性”,将其称为推测用法,即表示人们对某件事发生的可能性大小所做的判断。
  • 另一类是各个情态动词有各自基本的意思,比如,can意为“能够”,must意为“必须”,should意为“应该”等等。

关于“约翰生病”的例子:
1) John isn’t in class. He is sick.
2) John isn’t in class. He must be sick.
3) John isn’t in class. He may be sick.
例句1)没有使用情态动词,只用了一般现在时态的is,这表明说话人只是在陈述一个客观事实,即“约翰生病了”。这句话没有表明说话人的态度(the speaker’s attitude)。而例句2)和3)这两句使用了情态动词,表明了说话人的态度。例句2)用的是must,意为“一定是,准是”,这表明说话人对于“约翰生病了”这件事是很有把握和信心的一个推断(deduction)。例句3)用的是may,意为“可能是,或许是”,这表明说话人对于“约翰生病了”这件事是比较没有把握和信心的一个推断。说话人推断“约翰生病了”。
这件事从三个不同的角度(perspective)来表达:

Read more »

这篇笔记摘选自张满胜老师的《英语语法新思维中级教程通悟语法第2版》,以及其他网上知识点收集,只是我自己的个人复习笔记,禁止转载,如有侵权,请联系我删除。
思维导图版本点击这里(Web版的XMind有一些问题)。

前言

从严格意义上来说,英文里是没有“将来时态”的, 而只有现在时态和过去时态这两种时态。

从时态形式(tense form)的构成上来看。现在时态(present tense)的构成是用动词原形(basic verb form),或遇到单数第三人称主语,谓语动词加-s。过去时态(past tense)的构成则是动词变为过去式(如加-ed或其他特殊变形),对于现在时态和过去时态,都是在谓语动词的词尾上进行变形。但对于将来时态,在动词的词尾却没有任何变形。

表格中的Tense(时)只有Past(过去时)和Present(现在时),而没有Future(将来时)。通常我们引入一个情态动词will来表示将来时态,但will的引入并不是谓语动词本身的词形变化。正是因为在表示将来时间内发生的事情时,英语谓语动词的词干(stem word)不会发生任何形式的变化,因此“将来时”的说法被看作是不贴切的。
表达将来时态,即人们谈论将来要发生的事情时,事实上是采取动词形式变化以外的其他方式来达到这一目的的。具体的方式非常多,比如使用情态动词will和be going to,比如使用现在进行时(be doing)表示将来的动作,以及采用其他的句型结构,如be to do或者be about to do等。从是否成为事实的角度(factual or non-factual)来看。将来的事情与发生在过去或现在的事情是完全不同的,发生在过去或现在的事情都已是确定无疑的,是一个事实(fact)。但谈论将来要发生的事情,就不可能成为一个确定无疑的事实,而只能是表示一种可能性。

It will rain later. 过一会会下雨。
我们传统上是把这里的will rain看作是一般将来时态,但实际上这里只是情态动词will表示“推测”或确切地说“预测(prediction)”的一种用法。另外,我们还可以用其他情态动词来表示这种预测,比如说:
It may rain later. 过会可能会下雨。
It might rain later. 过会或许会下雨。
这里的may和might同样可以表示对将来事情的预测,只不过肯定程度是递减的——will比may的把握性大,may比might的把握性大。
由此可见,典型的一般将来时will do,在本质上只是情态动词will 的一种用法而已。从这个意义上来说,英语里没有将来时态。

三个概念

  • 预测(prediction):表示说话人认为将来会发生某件事;
  • 事先计划(future plan):表示说话人在头脑里已经做出决定将来要做某件事;
  • 意愿(willingness):表示说话人既不是预计某事将会发生,也不是预先经过考虑决定将做某事,而是在说话的时刻立即做出决断表明他将去做某事。

will表示将来——预测

读者对will应该是非常熟悉的,因为它通常被作为一般将来时态的“代言人”,其最典型的用法就是对未来进行“预测”。
I wonder what it will be like in the 21st century. But from the great advances in these past years I assume that we will be entering a new golden age of miracles and wonders. Life will be fantastic in the 21st century.
不知道到了21世纪我们的生活会是什么样子。但从近几年巨大的发展来看,我猜想我们一定会进入一个全新的充满奇迹的黄金时代。21世纪的生活一定非常美好。

be going to表示将来——预测

Read more »

这篇笔记摘选自张满胜老师的《英语语法新思维中级教程通悟语法第2版》,以及其他网上知识点收集,只是我自己的个人复习笔记,禁止转载,如有侵权,请联系我删除。
思维导图版本点击这里(Web版的XMind有一些问题)。

表示说话者的一种主观愿望、假想和建议等等,实际上并不能实现。 这在英语里,用语法术语表达就叫“虚拟语气”。
If I could rearrange the alphabet, I would put U and I together.
一般来讲,英语中的虚拟语气可以分为两大体系:一是表示与事实相反的或假想的情形,通常由if引导,叫作“非真实条件句(unreal conditional)”,或者叫“虚拟条件句”;另一个体系是在名词从句中使用虚拟语气,表示建议、命令或要求等语气,这是一个完全不同于非真实条件句的虚拟的结构形式。

虚拟条件句:两类三时

这里说的“两类三时”是指虚拟条件句具有两种类型,并会对三种时间进行虚拟。
具体来说,虚拟条件句的两种类型是:***假设条件句 (hypothetical)和事实相反句(counterfactual)。 ***
假设条件句,顾名思义,是表示一种假想的情形,表示说话者的一种主观愿望或态度等,实现的可能性不大或极小。
事实相反句,顾名思义,是表示与现在或过去的某个事实相反的情形。对三种时间进行虚拟,即是对将来、现在和过去这三种时间的虚拟。
对于将来的情形只能是假设;对于现在的情形既可以是假设,也可以是谈与现在事实相反的情况;对于过去,只能是谈与事实相反的情形。

If I were to have the time tomorrow, I would help him.
这里是表示将来虚拟假设的情形。用了虚拟,就表明说话人“我”认为自己明天有时间的可能性不大,所以言外之意是“我”可能帮不了他。这里用虚拟只是说明可能性不大(unlikely),而不是表达与事实相违背的不可能的情形(impossible)。
If I had the time now, I would help him.
这里是表示现在虚拟假设的情形。用了虚拟,就表明说话人“我”认为自己现在有时间的可能性不大,所以言外之意是“我”可能帮不了他。这里用虚拟也只是说明可能性不大(unlikely),而不是表达与事实相违背的不可能的情形(impossible)。比如“我”现在完全可以抛开一切事情不做而去帮他,所以可能性还是存在的。
If I were you, I would help him.
这里是表示与现在事实相反的情形。因为“我”成为“你”是不可能发生的(impossible)情形,而不是可能性不大 (unlikely)的情形了。

表示与现在事实相反的情形:
If I were the President, I would make some changes.
“我”现在不是“总统”,这是一个现在的事实,即这里是表示与现在事实相反的情形。
如果我是总统,我就会做一些改革。
If my grandfather were alive today, he would experience a very different world.
If my grandfather were here now, he would be angry.
“我爷爷”现在不在这里,这是一个现在的事实,即这里是表示与现在事实相反的情形。
如果我爷爷现在在这里,他会很生气的。
表示对过去事实虚拟的句子:
If I had had the time yesterday, I would have helped him.

综上所述,假设条件句表达的是一种在将来或现在可能性不大(unlikely)的情形,但不是不可能(impossible)的情形,表示说话人认为不可能,是一种比较主观的表达,而不是与客观事实相反。它尤其用来谈将来的情形,也可以谈现在。事实相反句表达的是一种与现在或过去的事实相违背的情形,因此是不可能发生的,而不是可能性不大。它适合谈现在或过去。由此可见,谈将来的情形,只能是假设条件句;谈现在的情形,既可能是假设条件句,也可能是事实相反句;谈过去的情形,只能是事实相反句。

虚拟条件句的谓语变化

三种不同时间下的主、从句的谓语形式列表如下:

将来虚拟(ZjCj)

Read more »