算法与数据结构1800题 之栈和队列(三)

666 阅读2分钟


不会做,答案为正确,但是我觉得不正确



消除递归不一定要使用栈,比如尾递归就不需要使用栈,
但是尾递归现在还没有弄太明白


栈是实现过程,和函数等子程序所必需的结构
在调用过程或者函数的时候,首先将当前信息保存于栈中(保存现场,然后再去执行过程或者函数,当执行完子程序的时候,读出栈中的信息返回到主函数


顺序存取:必须是挨着存,挨着取
随机存取:随意存取不同位置的元素,直接存,可以隔着存

共享栈的好处:更有效的利用存储空间,降低上溢发生的概率
上溢:满了还加就是上溢
下溢:空了还取,就是下溢
两个栈共享一个向量空间的优点是其中一个栈可以用该空间的一般或者以上(话没错,但是这算是优点吗?从节省存储空间的角度来看,是优点)

是有可能相同,而不是一定相同

此公式,叫做卡特兰数公式,一般使用穷举法解此题
百度,卡特兰式链接:https://baike.baidu.com/item/%E5%8D%A1%E7%89%B9%E5%85%B0%E6%95%B0

错,因为有栈顶指针,所以,应该为O(1);


因为是按照1,2,3,4,5顺序入栈,所以从栈底到栈顶,一定是升序的,即使有中间元素出栈的情况


任何一个递归过程都可以转换成费递归过程,有的是使用栈,有的可以不使用栈,比如尾递归转换成非递归,就不需要栈


使用普通递归方法求阶乘,没有使用局部变量,也必须使用栈才能将递归转化为非递归
使用栈是因为上一步的计算依赖下一步的计算的结果,现在的结果计算不出来,所以必须使用栈来保存现场,然后再逐层返回

不要将符号入栈,和常量输出连起来,这样就会乱
入栈,和相应的出栈是一个连续的(整体的)动作,常量输出不能插入在入栈和出栈操作之间
注意:出栈,如果遇到优先级小的,和优先级相同的,都必须出栈, 而且是一直出栈,知道无法出栈为止

根据教材中的链表头尾与队列头尾的对应关系,入队操作发生在链表的尾部,即使没有尾指针,也能通过头指针找到尾指针,进行入队操作


队头也就是链表头,指针可以沿着next移动到队尾,实现对队尾的值的改变
如果队列中只有一个元素,那么在出队时,就会改变队尾的值(答案中的错误原因)