案例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,结束。