【Daily Report | 2026-01-26】
题单二总结DAY03。
题单二总结DAY03
复习内容
学习内容
1.P1739 表达式括号匹配
2.P4387 【深基15.习9】验证栈序列
3.P1449 后缀表达式
一、题目
P1739 表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255 255 255,左圆括号少于 20 20 20 个。
输入格式
一行:表达式。
输出格式
一行:YES 或 NO。
输入输出样例 #1
输入 #1
2*(x+y)/(1-x)@
输出 #1
YES
输入输出样例 #2
输入 #2
(25+x)*(a*(a+b+b)@
输出 #2
NO
说明/提示
表达式长度小于 255 255 255,左圆括号少于 20 20 20 个。
Tips
栈里面放()配对就行 (肯定 比)先入队
完整代码
#include<bits/stdc++.h>
using namespace std;
string s ="";
stack<char> a;
int main(){
cin>>s;
for(char ch: s){
if(ch == '(') a.push(ch);
else if(ch == ')'){
if(a.empty()) {
cout<<"NO";
return 0;
}else {
a.pop();
}
}else if (ch =='@') break;
}
if(a.empty()){
cout<<"YES";
}else{
cout<<"NO";
}
return 0;
}
P4387 【深基15.习9】验证栈序列
题目描述
给出两个序列 pushed 和 poped 两个序列,其取值从 1 1 1 到 n ( n ≤ 100000 ) n(n \le 100000) n(n≤100000)。已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。请注意,给定的序列一定是一个排列(即没有重复数字)。
为了防止骗分,每个测试点有多组数据,不超过 5 5 5 组。
输入格式
第一行一个整数 q q q,询问次数。
接下来 q q q 个询问,对于每个询问:
第一行一个整数 n n n 表示序列长度;
第二行 n n n 个整数表示入栈序列;
第三行 n n n 个整数表示出栈序列;
输出格式
对于每个询问输出答案。
输入输出样例 #1
输入 #1
2
5
1 2 3 4 5
5 4 3 2 1
4
1 2 3 4
2 4 1 3
输出 #1
Yes
No
Tips
记得用栈存就行了
完整代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int q;
scanf("%d",&q);
while(q--){
int x =0;
scanf("%d",&x);
vector<int>c(x);
vector<int>d(x);
for(int i =0;i<x;i++){
scanf("%d", &c[i]);
}
for(int i =0;i<x;i++){
scanf("%d", &d[i]);
}
stack<int>a;
int i=0,j =0;
while(i<x && j<x ){
a.push(c[i]);
i++;
while(!a.empty()&& a.top() == d[j]){
a.pop();
j++;
}
}
if(a.empty()){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
P1449 后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
本题中运算符仅包含 +-*/ \texttt{+-*/} +-*/。保证对于 / \texttt{/} / 运算除数不为 0。特别地,其中 / \texttt{/} / 运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。
如: 3*(5-2)+7 \texttt{3*(5-2)+7} 3*(5-2)+7 对应的后缀表达式为: 3.5.2.-*7.+@ \texttt{3.5.2.-*7.+@} 3.5.2.-*7.+@。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。
输入格式
输入一行一个字符串 s s s,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
输入输出样例 #1
输入 #1
3.5.2.-*7.+@
输出 #1
16
输入输出样例 #2
输入 #2
10.28.30./*7.-@
输出 #2
-7
说明/提示
数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 10 9 10^9 109。
完整代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
string s; stack<int>st; int num =0;
bool flag =true;
cin>>s;
for(char c :s){
if(c>='0'&&c<='9'){
num = num*10+(c-'0');
flag =true;
}else if(c == '.'){
st.push(num);
num =0;
flag = false;
}else if(c == '+'||c == '-'|| c == '*'||c == '/'){
int b = st.top();st.pop();
int a = st.top();st.pop();
int r =0;
if(c=='+') r = a+b;
else if(c=='-') r =a-b;
else if(c=='*') r =a*b;
else r=a/b;
st.push(r);
}else if(c=='@') break;
}
cout<<st.top();
return 0;
}
更多推荐



所有评论(0)