首页 > 其他分享 >【vjudge训练记录】大一寒假专项训练——栈

【vjudge训练记录】大一寒假专项训练——栈

时间:2025-01-14 18:11:56浏览次数:1  
标签:训练 int vjudge cin long while solve 大一 define

训练记录

今天洛谷崩了,先不统计了

A题

栈的模板题,pop出栈并输出栈顶,top输出栈顶,记得输出前判断一下栈内非空

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

stack<int> q;

void solve(){
    string s; cin>>s;
    if(s == "push"){
        int x; cin>>x;
        q.push(x);
    } else if(s == "pop"){
        if(!q.size()) cout<<"error"<<endl;
        else cout<<q.top()<<endl,q.pop();
    } else if(s == "top"){
        if(!q.size()) cout<<"error"<<endl;
        else cout<<q.top()<<endl;
    }
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

B题

同上一题,多了一个求栈内元素的个数,输出s.size()即可

#include <bits/stdc++.h>
#define int unsigned long long
#define endl '\n'

using namespace std;

void solve(){
    stack<int> s;
    int n; cin>>n;
    for(int i = 1;i<=n;i++){
        string opt; cin>>opt;
        if(opt == "push"){
            int x; cin>>x;
            s.push(x);
        } else if(opt == "pop"){
            if(!s.size()) cout<<"Empty"<<endl;
            else s.pop();
        } else if(opt == "query"){
            if(!s.size()) cout<<"Anguei!"<<endl;
            else cout<<s.top()<<endl;
        } else if(opt == "size"){
            cout<<s.size()<<endl;
        }
    }
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

C题

经典括号匹配问题,遇到左括号入栈,遇到右括号取栈顶判断是否可以配对,如果可以配对则出栈,不能配对则入栈,如果最后栈内还留有括号就是有括号无法匹配,如果栈为空则代表所有的括号都已经匹配

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    string s; cin>>s;
    stack<char> st;
    int n = s.size();
    for(int i = 0;i<n;i++){
        if(s[i] == '(') st.push(s[i]);
        else if(s[i] == ')'){
            if(st.size() && st.top() == '('){
                st.pop();
            } else {
                st.push(s[i]);
            }
        }
    }
    if(st.size()) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

D题

括号匹配的变式题,我们可以把fc和tb看成两种不同的括号,用栈进行一次括号匹配,记录匹配的括号数,最后用字符串的长度减去匹配的括号数就是剩下字符串的最短长度

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n; cin>>n;
    string s; cin>>s;
    int ans = 0;
    stack<char> st;
    for(int i = 0;i<n;i++){
        if(s[i] == 'c'){
            if(st.size() && st.top() == 'f'){
                ans+=2;
                st.pop();
            } else {
                st.push(s[i]);
            }
        } else if(s[i] == 'b'){
            if(st.size() && st.top() == 't'){
                ans += 2;
                st.pop();
            } else {
                st.push(s[i]);
            }
        } else {
            st.push(s[i]);
        }
    }
    cout<<n-ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

E题

后缀表达式经典题,遇到数字则数字入栈,字符串转int需要逐位处理,每次变量乘十加上当前位的数字,遇到符号则从栈内取出两个数字进行对应的运算再压栈,最后栈内剩下的那个元素就是后缀表达式的值。

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    string s; cin>>s;
    int n = s.size();
    stack<int> t;
    int num = 0;
    for(int i = 0;i<n;i++){
        if(s[i] == '.'){
            t.push(num);
            num = 0;
        } else if(isdigit(s[i])){
            num = num*10 + (s[i] - '0');
        } else if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/'){
            int y = t.top(); t.pop();
            int x = t.top(); t.pop();
            if(s[i] == '+') t.push(x+y);
            else if(s[i] == '-') t.push(x-y);
            else if(s[i] == '*') t.push(x*y);
            else if(s[i] == '/') t.push(x/y);
        }
    }
    cout<<t.top()<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

F题

众所周知乘法的优先级高于加法,所以我们需要把连续的乘法全部求出来再进行加法,我们可以使用栈先进后出的特性求连续的乘积,遇到乘法取栈顶进行乘法操作,遇到加法直接入栈,最后再将栈内所有元素求和就是答案

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

const int mod = 10000;

void solve(){
    stack<int> s;
    int x; cin>>x;
    s.push(x%mod);
    char a; int b;
    while(cin>>a>>b){
        if(a == '*'){
            int c = s.top(); s.pop();
            s.push(b*c%mod);
        } else s.push(b%mod);
    }
    int ans = 0;
    while(s.size()) ans += s.top(),ans%=mod,s.pop();
    cout<<ans<<endl;
}

signed main(){
    // int T; cin>>T; while(T--)
    solve();
    return 0;
}

G题

判断入出栈序列是否合法,我们按照入栈顺序进行入栈,再开一个指针变量指向第一个出栈序列,用while语句如果匹配则进行出栈操作并指针移动到下一位,如果不匹配则按照入栈顺序继续入栈,如果是合法的入出栈序列,最后的栈必定为空,我们判断最后栈是否为非空输出 NoYes,注意一下出栈前要判断栈是非空的

#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    int n; cin>>n;
    int a[n+1],b[n+1];
    stack<int> s;
    for(int i = 1;i<=n;i++) cin>>a[i];
    for(int i = 1;i<=n;i++) cin>>b[i];
    int pos = 1;
    for(int i = 1;i<=n;i++){
        s.push(a[i]);
        while(s.top() == b[pos]){
            s.pop();
            pos++;
            if(!s.size()) break;
        }
    }
    if(s.size()) cout<<"No"<<endl;
    else cout<<"Yes"<<endl;
}

signed main(){
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

标签:训练,int,vjudge,cin,long,while,solve,大一,define
From: https://www.cnblogs.com/longxingx/p/18671290

相关文章

  • LLM大模型入门必读免费白皮书《从头训练大模型最佳实践》免费pdf分享
    本书介绍《CurrentBestPracticesforTrainingLLMsfromScratch》是由Weights&Biases(W&B)提供的一份关于从头开始训练大型语言模型(LLMs)的权威指南。这份白皮书深入剖析了LLMs训练的最佳实践,内容覆盖了从数据收集与处理、模型架构选择、训练技巧与优化策略,到模型评估......
  • 日常训练2025-1-14
    日常训练2025-1-14C.MEXCyclerating:1500https://codeforces.com/contest/2049/problem/C思路注意这是一道构造题。用xy将环分成两段,为保证xy符合条件,要先给xy的权值设置成01,然后根据两段链的长度的奇偶有两种填数方案。偶数直接01填,奇数要先填一个2然后再随机填。评......
  • 代码随想录算法训练营总结
            为期2个月的训练营时间,总算是一步一步的顺利结束了,撒花撒花!!!    这个训练营算是我第一次比较系统的进行学习数据结构和算法以及刷力扣,以前总是刷到一半就半途而费了,这次总算是坚持着跟着群里的打卡节奏一步一步的完结了。    对于内容来说,内......
  • 代码随想录算法训练营第五十九天|KM47.参加科学大会|KM94.城市间货物运输Ⅰ
    47.参加科学大会(第六期模拟笔试)2、堆优化版(该方法没看懂)邻接矩阵的优点:表达方式简单,易于理解检查任意两个顶点间是否存在边的操作非常快适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。缺点:遇到稀疏图,会导致申请过大的二维数组造成空间浪费......
  • 文本预处理是指在将文本数据用于模型训练或分析之前,对其进行的一系列清洗、转换和处理
    文本预处理是指在将文本数据用于模型训练或分析之前,对其进行的一系列清洗、转换和处理操作。这些操作旨在消除文本中的噪声和不必要的信息,并将其转化为适合后续处理的格式。以下是文本预处理的一些常见方法:一、文本清洗去除HTML标记和特殊字符:移除文本中的HTML标签(如、等)......
  • R语言caret包实战:构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过m
    R语言caret包实战:构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过method参数指定算法名称、通过trainControl函数控制训练过程目录R语言使用caret包构建xgboost模型(xgbDART算法、使用的dropout思想)构建回归模型、通过method参数指定算法名称、通过trainCo......
  • 【从零开始系列】Qwen2.5 & Llama-Factory:开源语言大模型+训练平台——(超详细、最新版
    目录一、简介        1.Qwen2.5:开源模型        2.LLaMA-Factory:微调工具二、环境搭建       1.Python和Pytorch版本        2.llamafactory项目克隆安装       3.其他重要库安装三、模型微调       1.预训练模......
  • 代码随想录算法训练营第6天 | 哈希表理论基础,242.有效的字母异位词,349. 两个数组的交
    一、刷题部分1.1哈希表理论基础原文链接:代码随想录题目链接:......
  • 日常训练2025-1-13
    日常训练2025-1-13P5020[NOIP2018提高组]货币系统rating:普及+/提高https://www.luogu.com.cn/problem/P5020思路思考一下题目要干什么,原来的货币系统能够表示出一个集合,不能表示出一个集合,现在把货币数量减少之后能表示的集合和不能表示的集合不变——意味着原本的货币......
  • k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案
    前提:nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装,如果没有安装可以参考我之前发的文章GPUA800A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏16次。Ant系列GPU支持NvLink&N......