栈--括号匹配

根据括号匹配的嵌套性和不交叉性,可使用栈来实现该算法。

思路:

  1. 将每次出现的左括号保存于栈中
  2. 当遇到右括号时,先判断当前栈是否为空,若为空,则说明多余右括号,不匹配;若栈不为空但不与栈顶元素匹配,则不匹配,提前结束程序
  3. 若栈不为空,且与栈顶元素匹配,则重复以上操作,直至扫描完成最后一个元素
  4. 判断当前栈是否为空,若为空,则说明完全匹配;若不为空,则说明多余左括号,不匹配

代码如下:

#include<stdio.h>
#define MAX_SIZE 100
#define Stacktype char
#include<stdlib.h>
#include<stdbool.h>
typedef struct Stack{
    Stacktype *data;
    int top;
    int size;
}Stack;
void initStack(Stack *s);
void push(Stack *s,Stacktype r);
void pop(Stack *s,Stacktype *r);//将数据出栈
bool isEmpty(Stack s);
bool isMatch(char *str,int lg);
Stacktype getTop(Stack s);

void initStack(Stack *s){
    s->data=(Stacktype *)malloc(sizeof(Stacktype)*MAX_SIZE);
    s->size=MAX_SIZE;
    s->top=-1;
}
void push(Stack *s,Stacktype r){
    s->data[++s->top]=r;
}
void pop(Stack *s,Stacktype *r){
    *r=s->top;
    s->top--;
}
bool isEmpty(Stack s)
{
    if(s.top==-1)
    return true;
    else
    return false;
}
Stacktype getTop(Stack s)
{
    return s.data[s.top];
}
bool isMatch(char *str,int lg)
{
    Stack s;
    initStack(&s);
    for(int i=0;i<lg;i++){
        if(!str[i])
        break;
        if(str[i]=='('||str[i]=='['||str[i]=='{')//左括号全部存入栈内
        push(&s,str[i]);
        else//右括号
        {
            if(isEmpty(s))//栈为空,说明多余右括号
            return false;
            if(str[i]==')'&&getTop(s)!='(')
            return false;
            if(str[i]==']'&&getTop(s)!='[')
            return false;
            if(str[i]=='}'&&getTop(s)!='{')
            return false;
            pop(&s,&str[i]);
        }
    }
    return isEmpty(s);//全部匹配完成后,检查栈是否为空。
                      //栈非空时,说明多余左括号;栈为空时,完全匹配。
}

int main()
{
    char str[20];
    printf("请输入你想要匹配的括号:\n");
    scanf("%s",str);
    int lg=sizeof(str)/sizeof(char);
    bool flag=isMatch(str,lg);
    if(flag)
    printf("Successfully match!\n");
    else 
    printf("Not match.\n");
    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值