当前位置: 首页 > news >正文

【算法学习之路】8.栈和队列

栈和队列

  • 前言
  • 一.简介
  • 二.题目
    • 1
    • 2

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

一.简介

队列多用于辅助,很少有单独的题目。例如图的BFS,需要队列辅助实现。
重点是栈的应用以及题目。—先进先出(如左右匹配)
注意:做题时,多数使用数组直接模拟栈(队列)或者直接用c++STL中的stack(queue)

二.题目

1

洛谷P4387 【深基15.习9】验证栈序列
在这里插入图片描述
思路:用栈模拟

按入栈顺序入栈,如果栈顶元素与出栈序列的元素相同,就将其弹出。

首先将入栈序列的第i个元素压到“stack”中,(i, j分别是入栈序列和出栈序列的下标)

判断(注意用while判断,因为可能连续弹出)“stack”中的栈顶元素是否和出栈序列中的第j个元素一致(栈为空就不用判断了)如果一致则弹出栈顶元素,j++;如果不一致则继续压入入栈序列中的第i + 1个元素。

继续判断栈顶元素是否和出栈序列中的第j个元素一致,直到i到达入栈序列的末尾。

最后如果“stack”为空或指针j到达出栈序列的末尾就输出Yes,否则输出No

#include <iostream>
#include <stack>
using namespace std;
int a[100005], b[100005];
int main() {
	stack<int> s;
	int q, n; cin >> q;
	while (q--) {
		cin >> n;
		while (!s.empty()) {
			s.pop();
		}
		for (int i = 0; i < n; i++) {
			cin >> a[i];
		}
		for (int i = 0; i < n; i++) {
			cin >> b[i];
		}
		int j = 0;
		for (int i = 0; i < n; i++) {
			s.push(a[i]);
			while (s.top() == b[j]) {
				s.pop();
				j++;
				if (s.empty()) {
					break;
				}
			}
		}
		if (s.empty()) {
			cout << "Yes" << endl;
		}
		else {
			cout << "No" << endl;
		}
	}

	return 0;
}

2

力扣735. 小行星碰撞
在这里插入图片描述
思路:用栈模拟

以下情况不会发生碰撞,可把当前行星压入栈:
1.栈为空,不管当前行星是正是负(往左还是往右)都要压入栈;
2.当前行星和栈顶行星同号说明同向移动不会碰撞;
3.当前行星往右移动,栈顶行星向左移动也不会碰撞;

只有一种情况会发生碰撞,需要出栈:当前行星往左,栈顶行星往右,做判断:
1.栈顶元素大于abs(当前元素),当前元素被撞毁;
2.栈顶元素等于abs(当前元素),栈顶弹出和当前元素抵消;
3.栈顶元素小于abs(当前元素),栈顶弹出,并与新栈顶继续完成上述判断;

最终返回栈即可。

class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int> ans;
        int n = asteroids.size();
        for(int i = 0; i < n; i++){
            if(ans.empty()){
                ans.push_back(asteroids[i]);
            }
            else {
                if(ans.back() < 0){
                    ans.push_back(asteroids[i]);
                }
                else{
                    if(asteroids[i] > 0){
                        ans.push_back(asteroids[i]);
                    }
                    else{
                        if(asteroids[i] + ans.back() > 0){
                            continue;
                        }
                        else if(asteroids[i] + ans.back() == 0){
                            ans.pop_back();
                        }
                        else{
                            while(!ans.empty()&&ans.back()>0&&ans.back()+asteroids[i]<0){
                                ans.pop_back();
                            }
                            if(ans.empty() || ans.back() < 0){
                                ans.push_back(asteroids[i]);
                            }
                            else if(ans.back() + asteroids[i] == 0){
                                ans.pop_back();
                            }
                        }
                    }
                }
            }
        }
        return ans;
    }
};

相关文章:

  • Flutter中使用NetworkImage加载网络图片缓存问题学习实践
  • HTML 学习路线图
  • !C++中的位运算
  • 大语言模型-全文
  • linux应用:静态文件、 inode(i 节点)、vnode、流
  • Python 网络爬虫教程:从入门到高级的全面指南
  • 自然语言处理:无监督朴素贝叶斯模型
  • Spring Security 官网文档学习
  • GIS工具箱选择指南:四款软件满足多样化空间分析需求
  • Driver com.p6spy.engine.spy.P6SpyDriver claims to not accept jdbcUrl报错
  • 自动化App测试Appium(真机测试)准备
  • 基于SpringBoot+Vue的校园跑腿原生小程序
  • 用 Vue 3.5 TypeScript 做了一个日期选择器(改进版)
  • git subtree管理的仓库怎么删除子仓库
  • 队列概念和结构
  • Java 大视界 -- Java 大数据在智慧农业农产品质量追溯与品牌建设中的应用(124)
  • Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案
  • PostgreSQL 18新特性之虚拟生成列
  • Selenium/Playwright/Cypress对比与选型指南
  • 什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?
  • 国博馆刊|北朝至唐初夏州酋豪李氏家族的发展与身份记忆
  • 比尔·盖茨:未来20年通过盖茨基金会捐出几乎全部财富,2045年底基金会停止运营
  • 上海推动AI+文旅深度融合,MaaS平台和产业基地落地徐汇
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应
  • 重磅金融政策密集发布!一文梳理这场国新办发布会