数据结构实验之栈与队列四:括号匹配

本文介绍了一个使用栈数据结构实现的括号匹配算法。该算法能够处理包含括号、数字、字母等多种字符的字符串,并判断其括号是否正确配对。

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

Problem Description

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

 

Input

 输入数据有多组,处理到文件结束。

 

Output

 如果匹配就输出“yes”,不匹配输出“no”

 

Example Input
sin(20+10)
{[}]
Example Output
yes

no

#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct {     char *base;     char *top;     int stacksize; } SqStack; int InitStack(SqStack &S) {     S.base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));     if( !S.base) return -1;     S.top = S.base;     S.stacksize = STACK_INIT_SIZE;     return 0; } int GetTop(SqStack &S) {     return *(S.top - 1); } int Push(SqStack &S, char e) {     if(S.top - S.base >= S.stacksize)     {         S.base = (char*)realloc(S.base, (S.stacksize + STACKINCREMENT) *sizeof(char));         if(!S.base) return -1;         S.top = S.base + S.stacksize;         S.stacksize += STACKINCREMENT;     }     *S.top = e;     S.top++;     return 0; } void Pop(SqStack &S) {     S.top--; } int main() {     char s[60];     int flag, i;     while(gets(s) != NULL)     {         SqStack S;         InitStack(S);         flag = 0;         for(i = 0; s[i] != '\0'; i++)         {             if(s[i] == '[' || s[i] == '(' || s[i] == '{')                 {                     Push(S, s[i]);                 }             else if(s[i] == ')')             {                 if(S.base == S.top)                 {                     flag = 1;                     break;                 }                 else                 {                     if(GetTop(S) == '(')                     {                         Pop(S);                     }                     else                     {                         flag = 1;                         break;                     }                 }             }             else if(s[i] == ']')             {                 if(S.base == S.top)                 {                     flag = 1;                     break;                 }                 else                 {                     if(GetTop(S) == '[')                     {                         Pop(S);                     }                     else                     {                         flag = 1;                         break;                     }                 }             }             else if(s[i] == '}')             {                 if(S.base == S.top)                 {                     flag = 1;                     break;                 }                 else                 {                     if(GetTop(S) == '{')                     {                         Pop(S);                     }                     else                     {                         flag = 1;                         break;                     }                 }             }             if(flag == 1)                 break;         }         if(flag == 0 && S.base == S.top)             printf("yes\n");         else             printf("no\n");     }     return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值