首页 > 其他分享 >堆栈、队列、单调栈、单调队列1

堆栈、队列、单调栈、单调队列1

时间:2023-01-31 15:56:24浏览次数:58  
标签:队列 元素 ios long stk int 堆栈 单调

Stack和Queue——栈和队列

  • 栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出)
  • 队列的定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。(先进先出)
    stack常用函数:
  • push()——向栈顶压入元素
  • pop()——弹出栈顶元素
  • top()——访问栈顶元素
    queue常用函数:
  • front()——访问队首元素
  • back()——访问队尾元素
  • push()——向队尾插入元素
  • pop()——弹出队首元素

出栈顺序

题目描述:
有n个人,按照1,2,3...n的顺序依次进栈,判读能否以题目所给序列出栈。(n <= 100000)
eg:

  • 4 3 2 1
  • 1 2 3 4
  • 1 3 2 4
  • 1 4 2 3
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N];
int n;
stack<int> stk;
int main() {
	ios;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int j = 1;
	for (int i = 1; i <= n; i++) {
		stk.push(i);
		while (!stk.empty() && a[j] == stk.top()) {
			stk.pop();
			j++;
		}
	}

	if (!stk.empty()) cout << "No";
	else cout << "Yes";


	return 0;
}

栈和排序

思路:
如果栈顶元素比后面没入栈的元素都大,那么它就应该出栈

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int a[N], maxn[N];	//maxn数组预处理后缀最大值
int n;
stack<int> stk;
int main() {
	ios;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	
	//预处理
	for (int i = n; i >= 1; i--) {
		maxn[i] = max(a[i], maxn[i + 1]);
	}

	for (int i = 1; i <= n; i++) {
		stk.push(a[i]);
		while (!stk.empty() && stk.top() > maxn[i + 1]) {	//还没进栈的元素是否没有比栈顶元素大的
			printf("%d ", stk.top());
			stk.pop();
		}
	}
	
	//如果栈内还有元素,就直接输出
	while (!stk.empty()) {
		printf("%d ", stk.top());
		stk.pop();
	}
	return 0;
}

好串

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using namespace std;
typedef long long LL;

string s;
stack<int> stk;
int main() {
	ios;
	cin >> s;
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == 'a') {
			stk.push('a');
		} else {
			if (stk.empty()) {
				cout << "Bad" << endl;
				return 0;
			} else {
				stk.pop();
			}
		}
	}

	if (stk.empty()) cout << "Good";
	else cout << "Bad";
	return 0;
}

标签:队列,元素,ios,long,stk,int,堆栈,单调
From: https://www.cnblogs.com/csai-H/p/17079435.html

相关文章

  • 两个单调栈的问题
    两个单调栈的问题写灵神每日,遇到两个单调栈的经典问题,就放一起了问题一https://codeforces.com/problemset/problem/1691/D输入t(≤1e5)表示t组数据,每组数据输入n......
  • 代码随想录 |栈与队列总结篇
    基础知识:栈与队列都是容器接口,而非容器;栈与队列可选容器,缺省状态下是deque;提供push,pop等操作,但不提供送代器,不提供走访功能,因为只能在一边进行插入,弹出操作;栈的经典题......
  • 7-6 银行业务队列简单模拟
    #include<stdio.h>#include<stack>#include<queue>#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn; intflag=1; queue<int>s1,s2;//奇数s1a窗口 scanf("%......
  • 【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++
    第十章堆栈:::hljs-center目录第十章堆栈●前言●一、堆栈是什么?1.简要介绍●二、堆栈操作的关键代码段1.类型定义2.顺序栈的常用操作3.链式栈的常用......
  • 硬盘测速工具中的队列深度是个什么东西——CrystalDiskMark中的Q32T16是什么意思
     ================================ 最近有使用CrystalDiskMark给自己的硬盘做测速,发现有个名词自己不是很理解,就是像Q32T16这样的词: 在网上找了好久,都说Q32T16......
  • Redis实现分布式阻塞队列
    1.Redis分布式锁实现原理分布式锁本质上要实现的目标就是在Redis里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。占坑一般是......
  • 队列
    队列,具有先进先出特点,只允许在一端进行插入操作,在另一端进行删除。 代码实现#-*-coding=utf-8-*-#@Author:Wchime#@time:2023/1/2313:50#......
  • 双端队列
    双端队列是队列的扩展,可以在队列两端进行插入和删除。 代码实现#-*-coding=utf-8-*-#@Author:Wchime#@time:2023/1/2313:59#@file:双端......
  • ReentrantLock中的阻塞队列与唤醒机制
    阻塞的状态不是被创建后就会进入阻塞形态的    即进入无限期等待,即使其他线程调用了interrupt方法也无法将其唤醒,除非有其他线程释放了锁,并且该线程拿到了锁,才会......
  • 代码随想录算法训练营第十天 | 理论基础,232.用栈实现队列,225. 用队列实现栈
    一、参考资料理论基础文章讲解:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html用栈实现队列题目链......