ZISUOJ 数据结构-栈

题目列表:

问题 A: 数据结构-栈-括号匹配

思路:

        遇到左半边括号,将其入栈,遇到右半边括号,则先判断栈是否为空,若为空,则匹配失败,若不为空,则再判断栈顶元素是否是与之匹配的左半边括号,若不是,则匹配失败,一直匹配到栈空,如果栈空,则匹配成功,否则匹配失败

参考题解:

#include<bits/stdc++.h>
using namespace std;
stack<char> stk;
string line;
int main(){cin.tie(nullptr)->sync_with_stdio(false);getline(cin,line);for(auto c:line){if(c=='(') stk.push(c);else if(c==')'){if(stk.empty()){cout << "NO\n";return 0; }else{if(stk.top()=='(') stk.pop();}}}cout << (stk.empty()?"YES\n":"NO\n");return 0;
}

问题 B: 数据结构-栈-车厢顺序

思路:

        这个题也不知道怎么说思路,反正是很经典的一个题,如果实在不懂,可以去查一查资料。

参考题解:
 

#include<bits/stdc++.h>
using namespace std;
constexpr int MAXN = 1e3+5;
int n,cnt = 1;
array<int,MAXN> a;
stack<int> stk;
int main(){cin.tie(nullptr)->sync_with_stdio(false);cin >> n;for(int i = 0;i<n;i++) cin >> a[i];for(int i = 0;i<n;i++){while(cnt<=a[i]){stk.push(cnt++);}if(stk.top()==a[i]) stk.pop();else{cout << "NO\n";return 0;}}cout << "YES\n";return 0;
}

问题 C: 数据结构-栈-括弧匹配检验

思路:

        跟第一题相似,注意括号对应匹配即可。

参考题解:

#include<bits/stdc++.h>
using namespace std;
stack<char> stk;
string line;
unordered_map<char,char> mp = {{'(',')'},{'[',']'}};
int main(){cin.tie(nullptr)->sync_with_stdio(false);getline(cin,line);for(auto c:line){if(c=='('||c=='['){stk.push(c);}else if(c==')'||c==']'){if(stk.empty()){cout << "Wrong\n";return 0;}else{if(mp[stk.top()]==c) stk.pop();else{cout << "Wrong\n";return 0;}}}}cout << (stk.empty()?"OK\n":"Wrong\n");return 0;
}

问题 D: 数据结构-栈-字符串匹配

 

思路:

        这个题相比上一题,不仅要匹配的数量更多,并且还要注意括号优先级的问题,我这里选择再加了一个哈希表来匹配优先级。

参考题解:

#include<bits/stdc++.h>
using namespace std;
stack<char> stk;
string line;
int n;
unordered_map<char,char> mp = {{'<','>'},{'(',')'},{'[',']'},{'{','}'}};
unordered_map<char,int> pri = {{'<',1},{'(',2},{'[',3},{'{',4}};
void solve(){cin >> line;while(stk.size()) stk.pop();for(char c:line){if(c=='<'||c=='('||c=='['||c=='{'){if(stk.empty()) stk.push(c);else{if(pri[c]>pri[stk.top()]){cout << "NO\n";return;}else stk.push(c);}}else if(c=='>'||c==')'||c==']'||c=='}'){if(stk.empty()){cout << "NO\n";return;}else{if(mp[stk.top()]==c) stk.pop();else{cout << "NO\n";return;}}}}cout << (stk.empty()?"YES\n":"NO\n");
}
int main(){cin.tie(nullptr)->sync_with_stdio(false);cin >> n;while(n--) solve();return 0;
}

问题 E: 数据结构-栈-计算

思路:

        利用中缀表达式可以轻松求解,注意符号之间的优先级问题,计算'-'、'/'、'^'时要注意参与运算的两个数字的先后顺序。数据范围会到2^32-1,要开long long,虽然这个题的后台测试点没有取到那么大,不过根据题意还是要这么做的。

参考题解:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
stack<char> op;
stack<ll> num;
unordered_map<char,int> pri={{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
ll x;
string line;
bool flag;
void cal(){ll num1 = num.top();num.pop();ll num2 = num.top();num.pop();char op1 = op.top();op.pop();if(op1=='+') num.push(num1+num2);else if(op1=='-') num.push(num2-num1);else if(op1=='*') num.push(num1*num2);else if(op1=='/') num.push(num2/num1);else if(op1=='^') num.push(pow(num2,num1));
}
int main(){cin.tie(nullptr)->sync_with_stdio(false);cin >> line;for(auto c:line){if(c>='0'&&c<='9'){x=x*10+c-'0';flag = true;}else{if(flag){num.push(x);flag = false;x = 0;} if(c=='('){op.push(c);}else if(c==')'){while(op.top()!='('){cal();}op.pop();}else{while(op.size()&&pri[op.top()]>=pri[c]){cal();}op.push(c);}}}if(flag){num.push(x);x = 0;flag = false;}while(op.size()){cal();}cout << num.top() << '\n';return 0;
}

问题 F: 数据结构-栈-中缀表达式值

 

思路:

        跟上一题同理,但是这个题额外要注意的是可能存在负数,并且要判断该中缀表达式的合理性。

参考题解:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
stack<char> op;
stack<ll> num;
unordered_map<char,int> pri={{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
ll x;
string line;
bool flag;
void cal(){ll num1 = num.top();num.pop();ll num2 = num.top();num.pop();char op1 = op.top();op.pop();if(op1=='+') num.push(num1+num2);else if(op1=='-') num.push(num2-num1);else if(op1=='*') num.push(num1*num2);else if(op1=='/') num.push(num2/num1);else if(op1=='^') num.push(pow(num2,num1));
}
void solve(){for(auto c:line){if(c>='0'&&c<='9'){x=x*10+c-'0';flag = true;}else{if(flag){num.push(x);flag = false;x = 0;}if(c=='@') break;else if(c=='('){op.push(c);}else if(c==')'){while(op.top()!='('){cal();}op.pop();}else{while(op.size()&&pri[op.top()]>=pri[c]){cal();}op.push(c);}}}if(flag){num.push(x);x = 0;flag = false;}while(op.size()){cal();}cout << num.top() << '\n';
}
bool check(){if(line.size()==2) return pri[line[0]]>0?false:true;for(int i = 1;i<line.size()-1;i++){if(pri[line[i]]&&pri[line[i-1]]) return false;}ll sum = 0;for(int i = 0;i<line.size()-1;i++){if(line[i]=='(') sum++;else if(line[i]==')') sum--;}return sum==0;
}
int main(){cin.tie(nullptr)->sync_with_stdio(false);cin >> line;if(line[0]=='-') num.push(0);if(!check()) cout << "NO\n";else solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/620834.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔面板部署腾讯云的域名

一、腾讯云&#xff0c;搜索我的证书&#xff0c;点击打开如图所示&#xff0c;点击下砸 二、点击宝塔的证书&#xff0c;然后下载到桌面 三、解压 四、打开宝塔&#xff0c;网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去&#xff0c;保存并启用证书 六、有了…

快速掌握Spring监控(Spring Boot admin)

监控 监控可视化监控平台Admin底层逻辑info 自定义端点 监控 监控的作用&#xff1a; 监控服务状态是否宕机监控服务运行指标&#xff08;内存&#xff0c;虚拟机&#xff0c;线程&#xff0c;请求等&#xff09;监控日志管理服务&#xff08;服务下线&#xff09; 监控的实…

查看 Linux 接入的 USB 设备速率是 USB2 还是 USB3

查看接入 usb 设备的速率 使用以下命令查看接入的 USB 设备速率&#xff08;每一行最后的 xxM 字样&#xff09;。插入设备前查看一次&#xff0c;插入设备后查看一次&#xff0c;对比即可定位到刚插入的设备是哪一条。 lsusb -t命令输出如下图 对照 USB 速率表 对照 USB 速…

限制登录Linux服务器的几种方式

一.第一种方法 通过修改TCP Wrappers服务访问控制来实现限制登录Linux 1.这里以sshd服务为例&#xff0c;配置完成后&#xff0c;只允许配置允许的IP才能ssh连接本机服务器&#xff0c;其他IP拒绝判断某一个基于tcp协议的服务是否支持tcp_wrapper&#xff0c;要先判断它是否支…

关注招聘 关注招聘 关注招聘

&#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;开源产品&#xff1a; 1.农业物联网平台开源版 2.充电桩系统开源版 3.GPU池化软件(AI人工智能训练平台/推理平台) 开源版 产品销售&#xff1a; 1.农业物联网平台企业版 2.充电桩系统企业…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态&#xff08;mie和mip&#xff09;2.2 查询中断总开关与委托&#xff08;mstatus和mideleg&#xff09;2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

【C++】3.类和对象(中)

一、类的6个默认成员函数 在上一篇博客中&#xff0c;我们计算了空类的大小为 1 。那么空类中真的什么东西都没有吗&#xff1f;其实不是的&#xff0c;当一个类在什么都不写的时候就会自动生成6个默认的成员函数&#xff08;用户没有写&#xff0c;但是编译器自动生成的成员函…

vue--双向数据绑定原理

Vue采用数据劫持 发布者-订阅者模式实现双向数据绑定&#xff0c;实现逻辑图如下所示&#xff1a; 数据劫持 Vue 借助Object.defineProperty()来劫持各个属性&#xff0c;这样一来属性存取过程都会被监听到 发布者-订阅者模式 主要实现三个对象&#xff1a;Observer&#…

详解IP证书申请

申请IP证书&#xff0c;也被称为IP SSL证书&#xff0c;是一种特殊的SSL证书&#xff0c;它不同于传统的域名验证&#xff08;DV&#xff09;证书&#xff0c;是通过验证公网IP地址而不是域名来确保安全连接。这种证书用于保护IP地址&#xff0c;并在安装后起到加密作用。以下是…

Java对接第三方接口C#语言 请求是xml格式方式

文章目录 目录 文章目录 安装流程 小结 概要写法流程技术细节小结 概要 实现方式通过标签方式获取一个Body内标签的信息一步一步解析到需要获取到的数据信息 写法流程 技术细节 先和对面对接项目的开发拿到postman接口数据信息&#xff0c;然后再本地跑通接口&#xff0c;再进…

2024年Instagram运营必备:深入解析Instagram Insights成效分析

Instagram Insights是 Instagram 提供的一项免费数据分析工具&#xff0c;它可以帮助用户更好地了解其粉丝和帖子表现。通过这个工具&#xff0c;用户可以查看有关他们的粉丝、帖子互动和帖子表现的详细数据。更好地洞察目标受众的喜好&#xff0c;从而调整内容和定位策略。 In…

接口自动化测试之调用excel实现接口数据依赖

背景 我们把接口的信息按照规定的格式都维护在excel文件中&#xff0c;通过代码实现调用excel&#xff0c;完成接口的自动化测试。这样&#xff0c;只需要负责人将主要逻辑写好之后&#xff0c;公司其他不会写代码的员工&#xff0c;也可以通过维护excel中的接口数据&#xff…