栈与队列常见面试问题

问题一:使用数组实现栈和队列

实现栈的方法:

设置索引index用于表示插入时向哪个下标位置插入,初始时index指向0位置,

入栈:

当index = len(stack)时报栈满错误,否则stack[index++] = obj

出栈:

当index = 0时报栈空错误,否则index -= 1

peek操作:

当index = 0 时返回Null,否则返回stack[index - 1]

实现队列的方法:

设置索引start表示出队时从哪个下标出队,索引end表示从哪个下标入队,设置size变量代表队列长度

入队:

当size = len(stack)表示队满,报队满错误,否则size++,queue[end] = obj, end = next(size,end)

next(size,end)用于判断end是否和size-1相同,当相同时直接将end置0,否则自增1。

出队:

当size = 0表示队空,报队空错误,否则size--,tmp = start, start = next(size,start),返回stack[tmp]

next(size,start)用于判断start是否和size-1相同,当相同时直接将start置0,否则自增1

问题二:实现栈的基础上,实现返回栈中最小元素的功能,要求时间复杂度为O(1)

思路:

设置另一个min栈用于记录每时刻的最小值,当min栈栈空或者当前压入的元素小于min栈栈顶元素,直接将当前元素压入,否则重复压入min栈栈顶元素,入栈过程数据栈同步入栈。出栈时,只要栈不空,数据栈和min栈同步出栈。

改进想法:

只有当前入栈元素小于等于min栈栈顶时才入栈,否则只有数据栈入栈,在出栈时,只有当数据栈和min栈栈顶元素相同时再同步弹出。

问题三:用栈实现队列,用队列实现栈

用队列实现栈:

当入队时,正常向数据队列入队,当出队时,设置额外的一个队列暂存数据队列中的其他元素,数据队列仅保留一个元素,其余元素出队,入队到另一个队列,此时数据队列出队即为所求,然后将两个队列的引用交换。

用栈实现队列:

设置一个push栈一个pop栈,入队时向push栈入栈,出队时从pop栈出栈,方法就是在每一步操作后都要进行一个push到pop导数字的判断,基本原则:1.pop栈空时 2.push栈一次性导到pop栈。

问题四:猫狗队列

方法:

设置一个狗队列和一个猫队列,各自入队出队时同时将入队顺序数字压入,当需要将所有实例按照顺序出队时,只需要比较此时猫队列和狗队列的队首值哪个入队顺序数字小则哪个出队。

当出队时注意此时要判断是否猫狗都非空,或者其中一个是空的,或者两者都空则报错。

问题五:randompool

思路:

设计两个hashmap,一个是字符串:索引,一个是对应索引:字符串,这里我们要保证索引是连续的,这样可以通过random.randint或random.randrange生成数字,然后获取对应的字符串,为了达到这一点,在进行删除操作时,需要将最后一行的值盖到删除行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值