用栈进行括号匹配

xiaoxiao2021-02-28  15

题目要求:

给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )”  “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。

代码如下:

#include<stdio.h>

#include<string.h>#include<stdlib.h>#define N 100#define OK 1#define ERROR 0typedef char ElemType;typedef struct{    ElemType data[N];    int top;} SqStack;//初始化栈void Init(SqStack *s){    s = (SqStack *)malloc(sizeof(SqStack));    s -> top = -1;}//进栈int push(SqStack *s,ElemType n){    if(s -> top == N - 1)        return ERROR;    s -> top ++;    s -> data[s -> top] = n;    return OK;

}

//出栈int pop(SqStack *s,ElemType *n){    if(s -> top == -1)        return ERROR;    *n = s -> data[s -> top];    s -> top --;    return OK;}//判断栈是否为空int empty(SqStack *s){    return (s -> top == -1);}//括号匹配void match(SqStack *s,ElemType *str){    int flag = 0,i = 0;                 //flag == 1不匹配    ElemType n;    while(i < (int)strlen(str) && strlen(str) % 2 == 0)    {        switch(str[i])        {        case '(':        case '[':        case '{':            push(s,str[i]);            break;        case ')':            pop(s,&n);            if(n != '(')                flag=1;            break;        case ']':            pop(s,&n);            if(n != '[')                flag=1;            break;        case '}':            pop(s,&n);            if(n != '{')                flag=1;            break;        default:            flag=1;            break;        }        if(flag)            break;        i++;    }    if(flag == 0 && empty(s) == 0 && strlen(str) % 2 == 0)        printf("括号匹配成功!\n");    else        printf("括号匹配失败!\n");}int main(){    SqStack s;    Init(&s);                                                     //初始化    ElemType str[N];    printf("请输入括号:\n");    gets(str);    match(&s,str);    return 0;

}

运行结果:

转载请注明原文地址: https://www.6miu.com/read-2050005.html

最新回复(0)