栈与队列(2)

来源:互联网 发布:瓦尔登湖 知乎 编辑:程序博客网 时间:2024/06/05 07:13

案例1
实现一个特殊栈,在实现基础栈功能基础上,能返回栈中最小元素的操作getmin
要求:
1.pop、push、getMin操作时间复杂度都是O(1)。
2.设计的栈类型可以使用现成的栈结构。
方法1:两个栈,一个栈正常stackData,一个栈stackmin用于记录最小值
压入效果如图,stackmin只压入比栈顶小的值。
这里写图片描述
弹出的步骤:
这里写图片描述
这样stackmin在弹出过程维持着最小值。

方法二:
压入方式:
这里写图片描述
弹出数据时,两个栈弹出即可。

比较:方案1稍费时间,略省时间;方案2稍省空间,略费时间;

案例2
编写一个类,只能用两个栈结构实现队列,支持队列的基本操作(add、poll、peek)

解:两个栈,一个压入栈(只负责压入),一个弹出栈(只负责弹出)。
切换操作时,需两栈数据倒入
这里写图片描述

这里写图片描述

注意:每次倒数据,一定要一次性倒完。

案例3
实现一个栈的逆序,但只能用递归函数和这个栈本身的操作来实现,而不能自己申请另外的数据结构

代码一:

public int get(Stack<Integer> stack){   int result=stack.pop();   if(stack.isEmpty()){       return result;   }   else{       int last=get(stack);       stack.push(result);       return last;   }}

该函数功能为,移除栈顶元素并返回。
这里写图片描述

这里写图片描述

利用代码1,完成这题
代码2:

public void reverse(Stack<Integer> stack){   if(stack.isEmpty()){       return;   }   int i=get(stack);   reverse(stack);   stack.push(i);}

这里写图片描述

这里写图片描述

案例4
想将一个整型栈从顶到底按从大到小排序,只许申请一个栈,除此之外可以申请新的变量,但不能申请额外数据结构,如何实现?

申请个help栈,原栈stack
1.stack弹出栈顶,压入help中
2.stack弹出栈顶,与help栈顶比较,若小,压入help。若大,将help元素逐渐弹出,重新压回stack,然后把该元素压入help。
3.重复2,直到stack空,然后把help完全压入stack,结束。