栈和队列基础练习题(持续更新~)

表达式括号匹配

题目描述

假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"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;
} 
posted @ 2022-07-21 15:56  HeadmasterEggy  阅读(224)  评论(0)    收藏  举报