队列和栈面试题【数据结构】

写在开始:这里这表明每种问题的思路,具体代码详见其他文章。

1.实现一个栈,要求实现Push(出栈)Pop(入栈)Min(返回最小值)的时间复杂度为O(1)。

1>借助两个栈S1,S2、S1存所有元素、S2存最小元素。

入栈----当遇到的元素小于S2栈顶的元素,则为最小元素,S1,S2都入栈,否则只入S1。

出栈-----遇到最小元素都出

S2栈顶保存当前栈的最小值

2>一个栈,放最小值和当前元素。(仅提供思路)

入栈---先将当前元素压栈然后将当前最小值压栈

出栈----一次出两个元素

栈顶元素即是最小值

3>一个栈,将当前元素和最小值封装成结构体

入栈----栈中无数据,当前元素直接入栈,当前元素的最小值大于栈顶元素的最小值时,更新当前元素的最小值域,并入栈。

出栈----直接出栈即可

栈顶元素的最小值域即为栈的最小值。

2.使用两个栈实现一个队列

入队列:只入栈S1

出队列:如果栈S2为空,就把S1的元素全部搬移进S2(S2不为空,S2栈顶即为队头)。从S2出栈,即为出队列

队头:如果栈S2为空,就把S1的元素全部搬移进S2(S2不为空,S2栈顶即为队头)。返回S2栈顶元素

队尾:如果栈S1为空,就把S2的元素全部搬移进S1,(S1不为空,S1栈顶元素即为队尾)。 返回S1栈顶元素

3.使用两个队列实现一个栈

入栈:判断哪个队列不空将元素入哪个队列(第一个元素入q2)。

出栈:q1为空将q2的前size - 1个元素搬移进来,将q2最后一个元素出队列,同理将q1的最后一个元素出队列,即为出栈。

栈顶元素:判断哪个队列不为空,其队尾元素即为栈顶元素

4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)

设置两个指针、借助栈  

一个指向入栈次序的开始、一个指向出栈序列的开始

栈为空,或栈顶元素不等于出队栈序列的索引所指向的元素,且入栈次序的索引未越过边界,此时入栈,入栈序列索引向后移动。

栈不为空,且栈顶和出栈次序的索引指向的元素相同,出栈,出队列索引向后移动。

只要出队列索引未出边界循环前两步

5. 一个数组实现两个栈(共享栈)

1>两个栈相向增长

2>第一个栈的元素放在奇数位置、第二个栈的元素放在偶数位置(可能会造成空间浪费)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值