括号匹配习题——栈

题目描述

输入一串字符串(长度不超过50),其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1。

注意不要有不必要的输出,比如“请输入字符串”。

输入

一行字符串。

输出

一个整数表示答案

输入样例: dfa(sdf)df[dfds(dfd)]                          // 匹配

输出样例: 0

大致分析:

        首先对于括号的匹配是其对于的 ' ( ' ' ) '  ' [ ' ' ] ' 的匹配,再关于其是否括号匹配,就是字符串中的 括号是否规范匹配 (即每输入一个‘  ’ 需要找到另一个 ‘  )’ )

        每当一对括号匹配后,该对括号间的任何字符(除括号外)即可消除(不再考虑)

        例如: 区别  ([) (括号不匹配) 与  (a) (括号匹配)    

        此外 关于除括号外的其他字符就不需要多加考虑。

过程(运用数据结构栈)

        每当输入一个字符,将这个字符入栈,当碰到 ' ( ' 或者 ‘ [  ’ (左括号),记录下来,寻找对应的 ' ) ' ' ] ' ,若未出现‘’ 或者 ‘ [ ' (左括号) 而直接遇到了 ' ) ' '  ]  '(右括号),则直接不匹配,输出 1

        当一对括号匹配后,括号内的字符进行出栈操作,当进行到最后时,若最后的字符串中不再包含括号则为括号匹配,否则不匹配

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Sqstack
{
    char data[51];
    int top;
}Sqstack;
int l,flag1,flag2;
char ch1[10001];
void push(Sqstack &s,char x) {s.data[++s.top]=x;} 	// 入栈操作 
char pop(Sqstack &s)         {return s.data[s.top--]; }	// 弹出栈顶操作 
char gettop(Sqstack &s)    {return s.data[s.top];}	// 访问栈顶操作 
int main()
{
    Sqstack s;
    scanf("%s",ch1); 
    l=strlen(ch1);
    for(int i=0;i<l;i++) 
    {
        push(s,ch1[i]); // 入栈 
        if(ch1[i]=='(') flag1++;	//碰到一个左括号  左括号个数++ 出现情况: (()) 因此需要记录个数 
        if(ch1[i]==')' ) // 出现右括号  
        {
        	if(flag1) //若栈前面出现左括号 
			{
				while(pop(s)!='(') // 弹出栈顶直至左括号 
	            {
	            	if(gettop(s)=='[' || gettop(s)==']') // 若左括号中间出现 其他括号 直接无效(括号不匹配) 
	            	{
	            		printf("1");
	            		return 0;
					}
				}
	            flag1--; // 一对括号匹配成功,记录左括号减少 
			 } 
           	else // 前面没有出现左括号,而直接出现右括号,必定不匹配 
           	{
           		printf("1");
           		return 0;
			}
        }
        if(ch1[i]=='[') flag2++; // 与上面同理出现 左中括号 
        if(ch1[i]==']')
        {
        	if(flag2)
        	{
	        	while(pop(s)!='[')
	            {
	            	if(gettop(s)=='(' || gettop(s)==')') 
	            	{
	            		printf("1");
	            		return 0;
					}
				}
	            flag2--;
			}
          	else
          	{
          		printf("1");
          		return 0;
			}
        }
    }
   	if(flag1==0 && flag2==0) //剩余字符中没有 左括号括号 
    	printf("0");
    else printf("1");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值