数据结构实验之栈四:括号匹配(栈的运用)

数据结构实验之栈四:括号匹配

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

 给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入

 输入数据有多组,处理到文件结束。

输出

 如果匹配就输出“yes”,不匹配输出“no”

示例输入

sin(20+10){[}]

示例输出

yesno

提示

             这道题,考察的是对于栈的用法。现阶段,栈对于我而言只是一种思考问题的方法: 先入的后处理,而每进入一个元素(数值)就和他的前一个元素(数值)相比较,并进行一系列的操作。
        本题的思路大体上也是如此:先输入一个字符串,再将该字符串中的“(”,“)”,“{”,“}”,“【”,“】”输入另外一个字符数组中。再输入时,如果进入的元素为各种括号的右侧,则对栈中的上一个元素进行判断,如果恰好是其对应的左部,则使该元素(在栈中的)出栈(将其下标减一)。当然若栈中本就没有元素即栈为空(下标为零),同样结束循环。,如果输入的为括号的左半部则继续向下进行。
        题目的突破口在于:无论什么括号,一定是从左半部开始,到其右半部结束,故,输入为左半部时,是不需要进行判断的(因为元素并未完全输入,找右半部也是找不到的)。而输入至右半部出现时,就要与其最靠前的一个括号元素相比较(也只能和一个括号的左半部比对),若符合则出栈。一旦无法出栈,就证明这是无法两两成功配对的了,那么,循环宣告结束,标记后退出。
       在判断时一方面借助标记元素,另一方面也要通过栈是否为空,只有栈未标记并且栈为空,才可以认为该字符串满足要求

来源

ma6174

示例程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int i,j,n,l;
    char s[150],p[150];
    while(gets(s)!=NULL)
    {
        n=strlen(s);
        j=0;                                      //标示符号
        l=1;
        for(i=0; i<n; i++)
        {
            if(s[i]=='{'||s[i]=='('||s[i]=='[')
            {
                p[j++]=s[i];
            }
            if(s[i]==')')
            {
                if(j==0)
                {
                    l=0;
                    break;
                }
                if(j>0&&p[j-1]=='(')              //与上一个元素比较
                {
                    j=j-1;
                }
                else if(j>0&&p[j-1]!='(')
                {
                    l=0;
                    break;
                }
            }
            if(s[i]==']')
            {
                if(j==0)
                {
                    l=0;
                    break;
                }
                if(j>0&&p[j-1]=='[')
                {
                    j=j-1;
                }
                else if(j>0&&p[j-1]!='[')
                {
                    l=0;
                    break;
                }
            }
            if(s[i]=='}')
            {
                if(j==0)
                {
                    l=0;
                    break;
                }
                if(j>0&&p[j-1]=='{')
                {
                    j=j-1;
                }
                else if(j>0&&p[j-1]!='{')
                {
                    l=0;
                    break;
                }
            }
        }
        if(l==0||j>0)
            printf("no\n");
        else if(j==0)
            printf("yes\n");
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值