栈与队列(2)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值