代码随想录day10栈和队列1

文章目录

数组模拟栈

题目链接

cpp 复制代码
#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();
}

栈的应用 单调栈

题目链接

cpp 复制代码
#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)

cpp 复制代码
#include <stack>
//声明
stack<int>stk1;
stack<string>stk2;
stack<ListNode*>stk3;
cpp 复制代码
myStack.push(10); // 入栈
myStack.pop(); // 出栈
if (!myStack.empty()) {
    int topElement = myStack.top(); // 访问栈顶元素
}
if (myStack.empty()) {
    // 栈为空
}
int stackSize = myStack.size(); // 获取栈的大小

数组模拟队列

题目链接

cpp 复制代码
#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)

cpp 复制代码
#include <queue>
std::queue<int> myQueue; // 声明一个空的整数队列
cpp 复制代码
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)

cpp 复制代码
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的元素

滑动窗口单调队列

题目链接

cpp 复制代码
#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.用栈实现队列

题目链接
文章讲解

主要思路就是把栈倒过来

cpp 复制代码
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. 用队列实现栈

题目链接
文章讲解

cpp 复制代码
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. 有效的括号

题目链接
文章讲解

cpp 复制代码
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. 删除字符串中的所有相邻重复项

题目链接
文章讲解

cpp 复制代码
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;
    }
};
相关推荐
陈壮实的搬砖日记14 分钟前
激活函数为何能增强神经网络的非线性表达能力?
深度学习·算法·机器学习
点云侠17 分钟前
PCL 点云旋转的轴角表示法
人工智能·线性代数·算法·计算机视觉·矩阵
君鼎1 小时前
剑指offer37_数组中出现次数超过一半的数字
数据结构·算法
豆沙沙包?1 小时前
2025年- H83-Lc191--139.单词拆分(动态规划)--Java版
java·算法·动态规划
潘小安1 小时前
『算法』图解数组排序全家桶 - 堆排序
算法·react.js·面试
星沁城2 小时前
172. 阶乘后的零
java·算法·leetcode
玉~你还好吗3 小时前
【LeetCode#第198题】打家劫舍(一维dp)
算法·leetcode
G等你下课3 小时前
摆动序列
算法
地平线开发者3 小时前
地平线高效 backbone: HENet - V1.0
算法·自动驾驶