PTA 7-5 括号匹配

题目描述

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

输入格式:

输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

输入样例1:

sin(10+20)

输出样例1:

yes

输入样例2:

{[}]

输出样例2:

no

思路分析

由题意分析可知,离得最近的左右括号一定要是匹配的,不然就是错误的。所以我们可以将输入字符串按顺序拆开,遇到左括号就存到堆栈中,遇到右括号就和堆栈取出来的元素匹配,其他符号不需要管。如果右括号和取出来的元素不匹配就返回false,退出循环。如果字符串循环完后,栈里面还有元素,也返回false,说明有的左括号是单个的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef char ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Create();
bool isEmpty(List L);//栈是否为空
bool Push(List L, ElementType x);
ElementType Pop(List L);
bool isTrue(char s[]);//括号匹配
int main()
{
    char s[101];
    gets(s);
    if(isTrue(s)){
        printf("yes\n");
    }else{
        printf("no\n");
    }
}
List Create()
{
    List L = (List)malloc(sizeof(struct Node));
    L->Next = NULL;
    return L;
}

bool isEmpty(List L)
{
    return (L->Next == NULL);
}
 
bool Push(List L, ElementType x)
{
    bool flag = false;
    List p = (List)malloc(sizeof(struct Node));
    p->Data = x;
    p->Next = L->Next;
    L->Next = p;
    flag = true;
    return flag;
}
 
ElementType Pop(List L)
{
    if(isEmpty(L))
    {
        return '-1';
    }
    else
    {
        ElementType flag = L->Next->Data;
        List p;
        p = L->Next;
        L->Next = p->Next;
        free(p);
        return flag;
    }
}
bool isTrue(char s[]){
    int i=0;
    char x;
    bool flag=true;
    List L=Create();
    while(s[i]!='\0'){
        if(s[i]=='('||s[i]=='['||s[i]=='{'){
            Push(L,s[i]);
        }
        if(s[i]==')'){
            x=Pop(L);
            if(x!='('){
                flag=false;
                break;
            }
        }
        if(s[i]==']'){
            x=Pop(L);
            if(x!='['){
                flag=false;
                break;
            }
        }
        if(s[i]=='}'){
            x=Pop(L);
            if(x!='{'){
                flag=false;
                break;
            }
        }
        i++;
    }
    if(!isEmpty(L))
        flag=false;
    return flag;
}

发布了20 篇原创文章 · 获赞 9 · 访问量 1454

猜你喜欢

转载自blog.csdn.net/nntcdhl/article/details/104881956