前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >栈和队列中的算法题

栈和队列中的算法题

作者头像
归思君
发布2023-10-16 08:49:02
1550
发布2023-10-16 08:49:02
举报
文章被收录于专栏:归思君的技术博客

1. 求栈中的最小值

1.1 题目介绍

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.

1.2 解题思路

代码语言:javascript
复制
利用两个栈,一个存储完整数据DataStack,一个只存储当前最小值MinStack。
元素入栈时,和MinStack中的栈顶元素比较,如果小或者等于则将该元素分别压入DataStack和MinStack;
若大则只将元素压入DataStack中,直至元素入栈完毕,最小值为MinStack的栈顶元素。
代码实现
代码语言:javascript
复制
//本题中可以直接引用现成的栈结构和方法
class MinStack {
    private Stack<Integer> DataStack;
    private Stack<Integer> MinStack;

    public MinStack() {
        this.DataStack = new Stack<Integer>();
        this.MinStack = new Stack<Integer>();
    }
	//入栈
    public void push(int newNum){
        if(this.MinStack.isempty()){
            this.MinStack.push(newNum);
        }else if(newNum < MinStack.getMin()){
            this.MinStack.push(newNum);
        }
        this.DataStack.push(newNum);

    }
	//出栈
    public int pop(){
        if(this.DataStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        int Num = this.DataStack.pop();
        if(Num == this.getMin()){
            this.MinStack.pop();
        }
        return Num;
    }
	//获得最小值
    public int getMin(){
        if(this.MinStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        return this.MinStack.peek();
    }

}

1.3 复杂度

时间复杂度:O(1) 空间复杂度:O(n)

2.用两个栈来模拟一个队列

2.1 题目介绍

编写一个类,用两个栈实现队列,支持队列的基本操作(add, poll, peek)

2.2 解题思路

  • 两个栈,一个做入队栈,另外一个做出队栈
  • 入队栈为空时,才能在出队栈中做出队操作
  • 出队栈不为空,不能向入队栈中压入元素
代码实现
代码语言:javascript
复制
public class TwoStacks_Queue{
	private Stack<Integer> pushStack;
	private Stack<Integer> popStack;
	
	public TwoStacks_Queue(){
		pushStack = new Stack<Integer>();
		popStack = new Stack<Integer>();
	}
	
	//add 入队操作
	public void add(int NewNum){
		if(popStack.isEmpty()){
            //若入队列栈非空,将该栈元素迁移到出队栈
            while(!pushStack.isEmpty()){
                popStack.push(pushStack.pop);
            }
            pushStack.push(NewNum);
        }
	}
	
	//poll 出队操作
	public int poll(){
		if(pushStack.isEmpty() & popStack.isEmpty()){
			throw new RuntimeException("队列为空");
		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
		}else if(popStack.isEmpty()){
			while(!pushStack.isEmpty()){
				popStack.push(pushStack.pop());
			}
		}
		return popStack.pop();
	}
	
	//peek 查看队首元素 和poll函数类似
	public int peek(){
		if(pushStack.isEmpty() & popStack.isEmpty()){
			throw new RuntimeException("队列为空");
		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
		}else if(popStack.isEmpty()){
			while(!pushStack.isEmpty()){
				popStack.push(pushStack.pop());
			}
		}
		return popStack.pop();
	}
}

2.3 复杂度

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 求栈中的最小值
    • 1.1 题目介绍
      • 1.2 解题思路
        • 代码实现
      • 1.3 复杂度
      • 2.用两个栈来模拟一个队列
        • 2.1 题目介绍
          • 2.2 解题思路
            • 代码实现
          • 2.3 复杂度
          相关产品与服务
          对象存储
          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档