zoukankan      html  css  js  c++  java
  • NYOJ 2 括号配对问题

    描述
    现在,有一行括号序列,请你检查这行括号是否配对。
    输入
    第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
    输出
    每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
    样例输入
    3
    [(])
    (])
    ([[]()])
    样例输出
    No
    No
    Yes

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    struct sStack
    {
    	char sign[10010];
    	int top;
    };
    
    void initstack(sStack &s)//构造一个空栈s
    {
    	s.top = -1;//表示为空栈
    }
    
    int emptystack(sStack &s)//判断是否为空栈
    {
    	return s.top == -1 ? 1 : 0;
    }
    
    int pushstack(sStack &s, char c)//插入元素c为新的栈顶元素
    {
    	s.sign[++s.top] = c;
    	return 1;
    }
    
    int popstack(sStack &s)//删除s的栈顶元素
    {
    	if(emptystack(s))
    		return 0;
    	s.top--;
    	return 1;
    }
    
    char topstack(sStack &s)//返回s的栈顶元素
    {
    	if(isemptystack(s))
    		return 0;
    	return s.sign[s.top];
    }
    
    int main()
    {
    	int n, len, i;
    	int flag;
    	char str[10010];
    	sStack s;
    	scanf("%d", &n);
    	while(n--)
    	{
    		flag = 1;
    		scanf("%s", str);
    		len = strlen(str);
    		initstack(s);
    		for(i = 0; i < len; i++)
    		{
    			if(str[i] == '(' || str[i] == '[')//当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
    
    				pushstack(s, str[i]);
    //当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
    //若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出;
    //若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出;
    			else if(str[i] == ')')
    			{
    				if(emptystack(s) || topstack(s) != '(')
    					flag = 0;
    				else
    					popstack(s);
    			}
    			else if(str[i] == ']')
    			{
    				if(emptystack(s) || topstack(s) != '[')
    					flag = 0;
    				else	popstack(s);
    			}
    			
    		}
    //字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号,匹配失败;
    //正常结束则括号匹配正确。
    		if(!emptystack(s))
    		     flag = 0;
    		if(flag)
    			printf("Yes
    ");
    		else
    			printf("No
    ");
    	}
    	return 0;
    }        
    
    

    题意解析:判断括号是否匹配的问题,如果当前的左括号和当前的右括号匹配就OK。需要用栈来解决,对栈的插入和删除操作,都是在栈顶进行的,所以只需要栈顶指针即可。特别的栈是按照后进先出的原则进行修改的。

     括号匹配共有四种可能的情况:
    a.左右括号配对次序不正确
    b.右括号多于左括号
    c.左括号多于右括号
    d.左右括号匹配正确

    依次考虑。。。

  • 相关阅读:
    jQuery.fly插件实现添加购物车抛物线效果
    jQuery 实现前端模糊匹配与首字母搜索
    Java生成微信二维码及logo二维码
    Map 与 JavaBean 的相互装换
    从零写Java Web框架——请求的处理DispatcherServlet
    从零写Java Web框架——实现Ioc依赖注入
    记一次校招面试
    使用DbUtils对JDBC封装实现面向实体查询
    HTTP Status 500 PWC6188 jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
    【插件】百度编译器ueditor插入视频的时候。在预览的窗口提示 “输入的视频地址有误,请检查后再试!
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236786.html
Copyright © 2011-2022 走看看