算法之栈和队列

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 06:41   11   0

1.设计一个有getmin功能的栈

思路:创建一个栈叫minstack,来实现查找功能的getmin。查找操作只要获取minstack的栈顶元素即可,变化较大的是压栈操作和出栈操作。

ps:压栈时原栈正常压入,在minstack栈中如果value大于栈就不压入,如果小于等于就压栈。这样就维护了一个从底到顶的降序序列

ps:出栈时原栈正常出栈,在minstack栈中如果出栈的元素大于栈顶就不出,如果等于栈顶元素就出栈,是不可能小于栈顶元素的因为栈顶就放的是最小元素。

2.由两个栈组成的队列

思路:两个栈称为s1只入栈和s2只出栈,主要涉及队尾的插入,队头的出队以及队头的查询。入队操作直接pop进s1即可。

ps:查询操作和出队操作类似,查询时候如果s2为空那么应该把s1的栈中的元素全部pop到s2中顺序就被逆序回来了,出队也是一样。队列判断为空就是s1和s2同时为空。而且还要注意s2不为空s1不能全部pop进s2中,否则会打乱顺序。

ps:既然两个栈可以实现一个队列,而且栈还可以改造成带有getmin的栈,那么队列也可以改造成0有getmin的功能。

3.用一个栈实现另一个栈的排序

可以使用一个help栈来实现另一个栈从顶到底按从大到小的顺序排列。

思路:让help栈从顶到底按从小到大排列,然后在pop到另一个栈就可以实现从顶到底按从大到小的顺序排列。实现help栈的从小到大排列,具体如下。

ps:cur元素小于等于help的栈顶元素就入栈;cur元素大于help的栈顶元素,那么help元素就出栈压入原stack栈直到满足cur元素小于等于help的栈顶元素。

4.求最短通路径

0代表有路,1代表无路,从左上角到右下角的最短路径。

思路一:使用dfs遍历每次都有四种方向但是要判断是否通路或者是否走过了,所有路径找到最小的那个。

思路二:使用bfs遍历找到的第一个右下角目标就是最短的路径。同样也需要判断是否走过了,防止重复。

5.用两个队列实现一个栈

思路:通过画图来考虑,可以先向q1里不断的添加元素,如果要出栈的话你需要删除q1里面最后加入的元素,那么可以把q1的其他元素全部加入大q2里,然后删除最后一个元素即可,可以这样一直不断的进行重复。

6.判断括号的有效性

思路一:使用栈进行模拟,栈里面只存储左括号。

思路二:使用两个计数指针,需要保证每次右括号数量都要小于等于左括号,然后在最终判断看数量是否相同。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP