代码随想录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 = myDeque2; // 访问下标为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;
    }
};
相关推荐
Jerry2 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry4 小时前
LeetCode 459. 重复的子字符串
算法
海石7 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石7 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry9 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding10 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL11 小时前
我的数据结构3——链表(link list)
数据结构·链表
a11177611 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜11 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry12 小时前
LeetCode 541. 反转字符串 II
算法