设计一个有getMin功能的栈

题目:

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求:

1、pop、push、getMin操作的时间复杂度都是O(1) 

2、设计的栈类型可以输用现成的栈结构

方案一:

代码实现Mystack

/*
 * time:2017/4/1
 * name:lqs
 */
package stack1;
import java.util.Stack;
/*
 * stackData:保存当前元素,其功能和一个正常的栈没有区别
 * stackMin:用于保存每一步的最小值
 */
public class Mystack {
private Stack<Integer>stackData;
private Stack<Integer>stackMin;

//实现构造方法
public void Mystack(){
this.stackData=new Stack<Integer>();//实例化对象
this.stackMin=new Stack<Integer>();
}
//压栈
public void push(int newNum){
if(this.stackMin.isEmpty()){//为空
this.stackMin.push(newNum);//直接压入
}else if(newNum<=this.getmin()){//newNum的值小于stackMin中的最小值
this.stackMin.push(newNum);//压入newNum
}
this.stackData.push(newNum);//无条件加入stackData栈
}

//取栈顶元素
public int pop(){
if(this.stackData.isEmpty()){//stackData为空
throw new RuntimeException("stack is empty!");
}
int value=this.stackData.pop();//stackData中弹出栈顶元素
if(value==this.getmin()){//与stackMin栈顶元素比较,若相等
this.stackMin.pop();//弹出stackMin栈顶元素
}
return value;
}

public int getmin(){
if(this.stackMin.isEmpty()){//为空
throw new RuntimeException("stack is empty!");
}

return this.stackMin.peek();//返回stackMin栈顶元素
}
}

测试类MystackTest:

package stack1;
public class MystackTest {
public static void main(String[] args) {
Mystack mystack=new Mystack();//实例化Mystack类对象
mystack.Mystack();
int test[]={1,2,3,4,5,4,3,2,8};//测试数组
int n=9;
try{
for(int i=0;i<n;i++){
mystack.push(test[i]);//压入栈
}
}catch(Exception e){
e.printStackTrace();
}
int number=mystack.pop();//stackData中弹出栈顶元素
int minNum=mystack.getmin();//stackMin中弹出栈顶元素
System.out.println("stackData中弹出栈顶元素:"+number+"\t"+"stackMin中弹出栈顶元素:"+minNum);
}
}


方案二:

代码实现Mystack2:

/*
 * time:2017/4/1
 * name:lqs
 */

package stack1;
import java.util.Stack;
public class Mystack2 {
private Stack<Integer>stackData;
private Stack<Integer>stackMin;

//实现构造方法
public void Mystack2(){
this.stackData=new Stack<Integer>();//实例化对象
this.stackMin=new Stack<Integer>();
}
//压栈
public void push(int newNum){
if(this.stackMin.isEmpty()){//为空
this.stackMin.push(newNum);//直接压入
}else if(newNum<=this.getmin()){//newNum的值小于stackMin中的最小值
this.stackMin.push(newNum);//压入newNum
}
else{
int newMin=this.stackMin.pop();//取stackMin最小元素
this.stackMin.push(newMin);//stackMin最小元素加入stackMin栈
}
this.stackData.push(newNum);//无条件加入stackData栈
}

//取栈顶元素
public int pop(){
if(this.stackData.isEmpty()){//stackData为空
throw new RuntimeException("stack is empty!");
}
int value=this.stackData.pop();//stackData中弹出栈顶元素
if(value==this.getmin()){//与stackMin栈顶元素比较,若相等
this.stackMin.pop();//弹出stackMin栈顶元素
}
return value;
}
public int getmin(){
if(this.stackMin.isEmpty()){//为空
throw new RuntimeException("stack is empty!");
}
return this.stackMin.peek();//返回stackMin栈顶元素
}
public static void main(String[] args) {
Mystack2 mystack2=new Mystack2();//实例化Mystack类对象
mystack2.Mystack2();
int test[]={1,2,3,4,5,4,3,2,8,99,3,4,76,8,68};//测试数组
try{
for(int i=0;i<test.length;i++){
mystack2.push(test[i]);//压入栈
}
}catch(Exception e){
e.printStackTrace();
}
int number=mystack2.pop();
int minNum=mystack2.getmin();
System.out.println("stackData中弹出栈顶元素:"+number+"\t"+"stackMin中弹出栈顶元素:"+minNum);
}
}

PS:绿色部分(两种方案的push()方法)为主要区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值