括弧匹配

本文介绍了一段使用C语言实现的括号匹配检查函数,包括括号的入栈、出栈操作以及匹配规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

//宏定义
#define OK  1
#define ERROR 0
#define TRUE  1
#define FALSE 0

//类型定义
typedef char SElemType;
typedef int Status;
typedef int BOOL;

//栈单元结构定义
typedef struct SNode
{
  SElemType data;
  struct SNode *next;
}*LinkSNode;

//栈结构定义
typedef struct
{
  LinkSNode top;  //栈顶指针
}*LinkStack;

//初始化栈
Status InitStack(LinkStack S)
{
  S->top=NULL;
  return OK;
}

//销毁栈
Status DestroyStack(LinkStack S)
{
  if(NULL==S)
  {
    printf("错误!栈已被销毁!\n");
    return ERROR;
  }
  
  free(S); 
  return OK;
}

//清空栈
Status ClearStack(LinkStack S)
{
  LinkSNode p;
  if(NULL==S->top)
  {
    printf("错误!栈已被清空!\n");
    return ERROR;
  }
  while(NULL!=S->top)
  {
    p=S->top;
    S->top=S->top->next;
    free(p);
  }
  
  return OK;
}

//获取栈顶元素
Status GetTop(LinkStack S,SElemType *e)
{
  if(NULL==S->top)
  {
    printf("获取错误!栈已空!\n");
    return ERROR; //如果栈为空,返回ERROR
  }
  *e=S->top->data;   //栈不为空则把栈顶元素赋值给e
  return OK;
}

//判断栈是否为空
BOOL IsEmpty(LinkStack S)
{
  if(NULL!=S->top)  return FALSE;
  return TRUE;
}

//压栈
Status Push(LinkStack S,SElemType e)
{
  LinkSNode new_node=(LinkSNode)malloc(sizeof(LinkSNode));
  if(NULL==new_node)
  {
    printf("内存不足,压栈失败!\n");
    return ERROR;
  }
  
  new_node->data=e;
  new_node->next=S->top;
  S->top=new_node;
  return OK;
}

//出栈
Status Pop(LinkStack S,SElemType *e)
{
  LinkSNode p=S->top;
  if(NULL==S->top)
  {
    printf("出栈失败!栈已空!\n");
    return ERROR; //如果栈为空,返回ERROR
  }
  
  //栈不为空则出栈
  *e=S->top->data; 
  S->top=S->top->next;
  free(p);
  return OK;
}

//判断是否为左括弧
BOOL IsLeft(char ch)
{
  switch(ch)
  {
  case '(':
  case '[':
  case '{':
    return TRUE;
  case ')':
  case ']':
  case '}':
    return FALSE;
  }
  return FALSE;
}

//判断左括弧和右括弧是否匹配
BOOL IsMatch(char ch_l,char ch_r)
{
  if(ch_l=='('&&ch_r==')')
  {
    return TRUE;
  }
  if(ch_l=='['&&ch_r==']')
  {
    return TRUE;
  }
  if(ch_l=='{'&&ch_r=='}')
  {
    return TRUE;
  }
  return FALSE;
}

//括弧匹配函数
Status Brackets_Match(LinkStack S)
{
  char e;       //用于接收出栈元素的值
  char ch;      //用于接收用户输入
  ch=getchar();
  
  do
  {
    if(TRUE==IsLeft(ch))
    {
      Push(S,ch);
    }
    else if(FALSE==IsEmpty(S)&&TRUE==IsMatch(S->top->data,ch))
    {
      Pop(S,&e);
    }
    else if(FALSE==IsEmpty(S)&&FALSE==IsMatch(S->top->data,ch))
    {
      printf("左右括弧不匹配!\n");
      return ERROR;
    }
    else if(FALSE==IsLeft(ch))
    {
      printf("右括弧多余!\n");
      return ERROR;
    }
    ch=getchar();
  }while('\n'!=ch);
  
  if(FALSE==IsEmpty(S))
  {
    printf("左括弧多余!\n");
    return ERROR;
  }
  else
  {
    printf("括弧匹配成功!\n");
  }
  return OK;
}

//主函数
int main()
{
  char e;
  LinkStack S=(LinkStack)malloc(sizeof(LinkStack));
  InitStack(S);
  Brackets_Match(S);
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值