栈和队列基础练习题(持续更新~)
表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回"NO"。表达式长度小于255,左圆括号少于20个。
输入
输入表达式(只有1行,长度小于255)
输出
输出包括一行,即"YES"或"NO"
样例输入
【样例输入1】
2*(x+y)/(1-x)@
【样例输入2】
(25+x)*(a*(a+b+b)@
样例输出
【样例输出1】
YES
【样例输出2】
NO
source code
#include <cstdio>
#include<iostream>
#include<bits/stdc++.h>
#include <cassert>
#include <cstdlib>
#include<vector>
#include<queue>
using namespace std;
int main()
{
string s;
cin>>s;
stack<char>p;
for(int i=0;s[i]!='@';i++){
if(s[i]=='(')
p.push(s[i]); //把'('放到栈顶
if(s[i]==')'){
if(!p.empty()) //如果栈顶有元素
p.pop(); //则删除栈顶的元素,不返回
else{
cout<<"NO"<<endl; //栈顶无元素 输出NO
return 0;
}
}
}
if(p.empty()) //栈空即'('和')'抵消 返回TRUE
cout<<"YES"<<endl; //输出YES
else cout<<"NO"<<endl;
return 0;
}
括弧匹配检验
题目描述
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。
输入一个字符串:[([][])],输出:OK
输入
输入仅一行字符(字符个数小于255)
输出
匹配就输出 “OK” ,不匹配就输出“Wrong”。
样例输入
[(])
样例输出
Wrong
source code
#include <cstdio>
#include<iostream>
#include<bits/stdc++.h>
#include <cassert>
#include <cstdlib>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
int main()
{
string s;
cin>>s;
stack<char>p;
for(int i=0;i<s.length();i++){
if(s[i]=='[') //放到栈顶
p.push(s[i]);
if(s[i]=='(')
p.push(s[i]);
if(s[i]==']'||s[i]==')'){
if(!p.empty()){ //如果栈非空即对应 [] OR ()
if(s[i]==']'){
if(p.top()!='['){ //如果栈顶不对应
cout<<"Wrong"<<endl;
return 0;
}else p.pop();
}
if(s[i]==')'){
if(p.top()!='('){ //如果栈顶不对应
cout<<"Wrong"<<endl;
return 0;
}else p.pop();
}
}
else{ //栈空即不对应
cout<<"Wrong"<<endl;
return 0;
}
}
}
if(p.empty())
cout<<"OK"<<endl;
else cout<<"Wrong"<<endl;
return 0;
}
签到
给定一个序列,你可以在序列中任取 4 个数 a,b,c,d (可以重复选取),问是否有一种选择满足:a+b+c=d
输入描述
第一行,一个正整数 n
第二行,n 个正整数,a1,a2,a3,...,an (1≤ai≤10^9)
输出描述
如果存在一种情况满足,则输出"Yes"(不加引号),否则输出"No"(不加引号)。
输入
4
1 8 20 90
输出
No
source code
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
//3重for循环会超时
int main()
{
int a[1005],n;
cin >> n;
for(int i = 0;i < n;i++){
cin >> a[i];
}
//枚举a和b,存入set
set<int> s;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
s.insert(a[i] + a[j]);
}
}
//枚举c和d
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(a[j] < a[i]){
continue;
}
int t = a[j] - a[i]; //d-c
if(s.find(t) != s.end()){
cout << "Yes";
return 0;
}
}
}
cout << "No";
return 0;
}

浙公网安备 33010602011771号