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

代码随想录day10栈和队列1

文章目录

  • 数组模拟栈
    • 栈的应用 单调栈
    • 栈(stack)
  • 数组模拟队列
    • 队列stl(queue)
    • 双端队列stl(deque)
    • 滑动窗口单调队列
  • 232.用栈实现队列
  • 225. 用队列实现栈
  • 20. 有效的括号
  • 1047. 删除字符串中的所有相邻重复项

数组模拟栈

题目链接

#include <iostream>
#include <cstdio>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include<list>
#include <set>
#include <ctime>
#include<unordered_map>
#include <bitset>
#include<random>
#include<regex>
#include <chrono>
#include<unordered_map>
#include<unordered_set>
using namespace std;typedef long long ll;
#define pr pair<double,int>
#define tp tuple<int,int,int>
const int N = 2e6 + 7;
const int mod = 998244353;
ll stk[N],tt;
// 定义一个名为solve的函数
void solve()
{ll m;cin>>m;while(m--){string s;ll q;cin>>s;if(s=="push"){cin>>q;stk[++tt]=q;}else if(s=="pop"){tt--;}else if(s=="query"){cout<<stk[tt]<<endl;}else{if(tt<=0) cout<<"YES"<<endl;else cout<<"NO"<<endl;}}
}int main()
{cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);//提高cin、cout的输入输出效率solve();
}

栈的应用 单调栈

题目链接

#include <iostream>
#include <cstdio>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include<list>
#include <set>
#include <ctime>
#include<unordered_map>
#include <bitset>
#include<random>
#include<regex>
#include <chrono>
#include<unordered_map>
#include<unordered_set>
using namespace std;typedef long long ll;
#define pr pair<double,int>
#define tp tuple<int,int,int>
const int N = 2e6 + 7;
const int mod = 998244353;
ll stk[N],tt;
ll a[N];
// 定义一个名为solve的函数
void solve()
{ll m;cin>>m;for(int i=0;i<m;i++){cin>>a[i];}for(int i=0;i<m;i++){while(tt&&stk[tt]>=a[i]){tt--;}if(tt<=0) cout<<"-1 ";else cout<<stk[tt]<<" ";stk[++tt]=a[i];}
}int main()
{cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);//提高cin、cout的输入输出效率solve();
}

栈(stack)

#include <stack>
//声明
stack<int>stk1;
stack<string>stk2;
stack<ListNode*>stk3;

在这里插入图片描述

myStack.push(10); // 入栈
myStack.pop(); // 出栈
if (!myStack.empty()) {int topElement = myStack.top(); // 访问栈顶元素
}
if (myStack.empty()) {// 栈为空
}
int stackSize = myStack.size(); // 获取栈的大小

数组模拟队列

题目链接

#include <iostream>
#include <cstdio>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include<list>
#include <set>
#include <ctime>
#include<unordered_map>
#include <bitset>
#include<random>
#include<regex>
#include <chrono>
#include<unordered_map>
#include<unordered_set>
using namespace std;typedef long long ll;
#define pr pair<double,int>
#define tp tuple<int,int,int>
const int N = 2e6 + 7;
const int mod = 998244353;
ll q[N],tt=-1;//队尾
ll hh;//队头
// 定义一个名为solve的函数
void solve()
{ll m;while(m--){string s;cin>>s;if(s=="push"){ll x;cin>>x;q[++tt]=x;}else if(s=="pop") hh++;else if(s=="query") cout<<q[hh]<<endl;else {if(tt-hh<=0) cout<<"YES\n";else cout<<"NO\n";}}
}int main()
{cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);//提高cin、cout的输入输出效率solve();
}

队列stl(queue)

#include <queue>
std::queue<int> myQueue; // 声明一个空的整数队列

在这里插入图片描述

myQueue.push(10); // 入队
myQueue.pop(); // 出队
if (!myQueue.empty()) {int frontElement = myQueue.front(); // 访问队首元素int backElement = myQueue.back(); // 访问队尾元素
}
if (myQueue.empty()) {// 队列为空
}
int queueSize = myQueue.size(); // 获取队列的大小

双端队列stl(deque)

std::deque<int> myDeque; // 声明一个空的整数双端队列

在C++的STL(Standard Template Library)中,deque(双端队列)是一个非常有用的容器。deque是一个双向开口的连续线性空间,可以在两端进行高效的插入和删除操作。本文将详细介绍C++ STL中deque的特点、使用方法和一些常见操作。
特点
deque具有以下特点:
双向开口:deque可以在两端进行高效的插入和删除操作,即在队首和队尾都可以进行操作。
动态扩展:deque的内部实现使用了分段连续线性空间,可以动态扩展以适应元素的增加。
随机访问:deque支持随机访问,可以通过下标访问元素。

在这里插入图片描述
myDeque.push_back(10); // 在队尾插入元素
myDeque.push_front(20); // 在队头插入元素
myDeque.pop_back(); // 删除队尾元素
myDeque.pop_front(); // 删除队头元素
if (!myDeque.empty()) {
int frontElement = myDeque.front(); // 访问队头元素
int backElement = myDeque.back(); // 访问队尾元素
}
if (myDeque.empty()) {
// 双端队列为空
}
int dequeSize = myDeque.size(); // 获取双端队列的大小
int element = myDeque[2]; // 访问下标为2的元素

滑动窗口单调队列

题目链接

#include <iostream>
#include <cstdio>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include<list>
#include <set>
#include <ctime>
#include<unordered_map>
#include <bitset>
#include<random>
#include<regex>
#include <chrono>
#include<unordered_map>
#include<unordered_set>
using namespace std;typedef long long ll;
#define pr pair<double,int>
#define tp tuple<int,int,int>
const int N = 2e6 + 7;
const int mod = 998244353;
ll a[N];// 定义一个名为solve的函数
void solve()
{int n, k;cin >> n >> k;for (int i = 1; i <= n; i ++ ) cin >> a[i];//读入数据deque<int> q;for(int i = 1; i <= n; i++){while(q.size() && q.back() > a[i]) //新进入窗口的值小于队尾元素,则队尾出队列q.pop_back();q.push_back(a[i]);//将新进入的元素入队if(i - k >= 1 && q.front() == a[i - k])//若队头是否滑出了窗口,队头出队 q.pop_front();if(i >= k)//当窗口形成,输出队头对应的值cout << q.front() <<" ";}q.clear();cout << endl;//最大值亦然for(int i = 1; i <= n; i++){while(q.size() && q.back() < a[i]) q.pop_back();q.push_back(a[i]);if(i - k >= 1 && a[i - k] == q.front()) q.pop_front(); if(i >= k) cout << q.front() << " ";}
}int main()
{cin.tie(0); cout.tie(0);ios::sync_with_stdio(false);//提高cin、cout的输入输出效率solve();
}

232.用栈实现队列

题目链接
文章讲解
主要思路就是把栈倒过来

class MyQueue {private:stack<int> in,out;void in2out() {while (!in.empty()) {out.push(in.top());in.pop();}}
public:MyQueue() {}void push(int x) {in.push(x);}int pop() {if(out.empty()) in2out();int x=out.top();out.pop();return x;}int peek() {if(out.empty()) in2out();return out.top();}bool empty() {if(out.empty()) in2out();return out.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

225. 用队列实现栈

题目链接
文章讲解

class MyStack {private:queue<int> in,out;public:MyStack() {}void push(int x) {out.push(x);while(!in.empty()){out.push(in.front());in.pop();}swap(in,out);}int pop() {int x=in.front();;in.pop();return x;}int top() {return in.front();}bool empty() {return in.empty();}
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

20. 有效的括号

题目链接
文章讲解

class Solution {
public:bool isValid(string s) {stack<char> stk;for(int i=0;i<s.size();i++){if (s[i]=='(')  stk.push(')');else if (s[i]=='[')  stk.push(']');else if (s[i]=='{')  stk.push('}');else{if(stk.empty()||stk.top()!=s[i]) return false;stk.pop();}}return stk.empty();}
};

1047. 删除字符串中的所有相邻重复项

题目链接
文章讲解

class Solution {
public:string removeDuplicates(string s) {string ans="";stack<char> stk;for(int i=0;i<s.size();i++){if(stk.size()>=1&&s[i]==stk.top()){stk.pop();}else stk.push(s[i]);}while(!stk.empty()){ans+=stk.top();stk.pop();}reverse(ans.begin(),ans.end());return ans;}
};

相关文章:

  • Redis03
  • WebGL图形学总结(二)
  • CSS3 2D 转换详解
  • 结构体解决冒泡排序
  • NDS 中文游戏全集下载 任天堂NDS简介NDS支持GBA游戏
  • 【LLM学习笔记4】使用LangChain开发应用程序(上)
  • PTA天梯赛L1 091-100题目解析
  • CSS知识补充 --- 控制继承
  • 阿里巴巴开源的 分布式事务解决方案Seata
  • 第六章 进阶24 小枫的学业
  • 软件测试题
  • DirectShowPlayerService::doRender: Unresolved error code 80040266
  • 【蓝牙】Qt4中向已配对的手机发送PDF文件
  • 《Go语言圣经》通过接口解耦包依赖
  • C++ 泛型编程利器:模板机制
  • OSCP备战-LordOfTheRoot靶机复现步骤
  • UniSAL:用于组织病理学图像分类的统一半监督主动学习方法|文献速递-深度学习医疗AI最新文献
  • 前端工程结构设计指南:如何让模块解耦、易维护、可拓展
  • 京东云 centos vim有操作混乱的问题
  • C/C++ 高频八股文面试题1000题(一)
  • 模板搭建网站/站长工具综合权重查询
  • 河南省建设厅厅长/重庆白云seo整站优化
  • 域名申请好了 要怎么做网站/seo服务是什么意思
  • 延边州住房城乡建设局网站/漳州seo建站
  • 软件下载网站模版/百度的网址是多少
  • 国内知名网站建设企业/搜索引擎优化是指什么意思