数据结构课程设计之括号匹配

题目
括号匹配问题,假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个函数,用来判别表达式中括号是否正确匹配

在这里插入图片描述在这里插入图片描述在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef char SElemType;
#define OK 0
#define ERROR 1
#define OVERFLOW -2
typedef int Status;
 
typedef struct
{
        SElemType   *base;
        SElemType   *top;
        Status stacksize;
}SqStack;
 
Status InitStack(SqStack* S)
{
    S->base =(char*)malloc(sizeof(SElemType) * MAXSIZE);
    if( !S->base )   return OVERFLOW;
    S->top = S->base;
    S->stacksize = MAXSIZE;
    return OK; 
}
 
Status StackLength( SqStack S )
{
    return S.top - S.base;
}
 
Status Push( SqStack* S, SElemType e) 
{
    if( S->top - S->base== S->stacksize )
        return ERROR;
    *S->top++=e;
    return OK;
}
 
SElemType Pop( SqStack* S, SElemType e)
{
    if( S->top == S->base )
    {
        return 'w';
    }
    e=*--S->top;
    return e;
}
 
Status DestroyStack( SqStack* S )
{
    if( S->base )
    {
        free(S->base);
        S->stacksize = 0;
        S->base = S->top = NULL;
    }
  return OK;
}
   
Status isLeft(char c) 
{ 
    Status ret = 0; 
     switch(c) 
     { 
        case '(': 
        case '[':
        case '<':   
        case '{': 
        case '\'': 
        case '\"': 
            ret = 1; 
            break; 
        default: 
            ret = 0; 
            break; 
                   
      } 
      return ret; 
} 
   
Status isRight(char c) 
{ 
    Status ret = 0; 
     switch(c) 
     {   
        case ')': 
        case ']':
        case '>': 
        case '}': 
        case '\'': 
        case '\"': 
            ret = 1; 
            break; 
        default: 
            ret = 0; 
            break; 
                   
      } 
      return ret; 
}
  
Status match(char left, char right) 
{ 
    Status ret = 0; 
       
    switch(left) 
    {   
        case '(': 
            ret = (right == ')'); 
            break; 
        case '[': 
            ret = (right == ']'); 
            break;
        case '<': 
            ret = (right == '>'); 
            break;
        case '{': 
            ret = (right == '}'); 
            break; 
        case '\'': 
            ret = (right == '\''); 
            break; 
        case '\"': 
            ret = (right == '\"'); 
            break; 
        default: 
            ret = 0; 
            break;   
    } 
    return ret;
}
  
Status judge(const char* code) 
{    
    SqStack stack;
    InitStack(&stack);
    Status ret=0;
    Status i=0;
       
    while( code[i] != '\0')
    {
        if(isLeft(code[i]))
        {
            Push(&stack,code[i]);
        }
        else if(isRight(code[i])) 
        {
           char c = Pop(&stack,*(stack.top));
           if(c=='w' || !match(c,code[i])) 
           { 
                printf("%c 匹配失败!\n",code[i]);
                break;
           }
        }
        i++;
    }
 
    if((StackLength(stack)==0)&&(code[i]=='\0')) 
    { 
           printf("成功!\n"); 
           ret = 1; 
    } 
    else if((StackLength(stack)!=0))
    { 
           printf("左括号有多余,匹配失败\n");
           ret = 0;
    } 
    DestroyStack(&stack);
    return ret; 
} 
   
int main() 
{
	printf("进入匹配查询,******* \n");
    char* str = (char*)malloc(sizeof(char)*MAXSIZE) ;
    scanf("%s",str);
    judge(str);
    free(str);
}

文档在这里,需要的小伙伴可以拿去参考一下
(里面有两个选题,因为我们老师当初就是让我们做两个选题的)
😛😛😛😛😛
链接:https://pan.baidu.com/s/1m83uA6DoLkxoF_H9947uJA
提取码:hb18

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值