表达式括号匹配(严3.19)

Description

假设一个算术表达式中可以包含三种括号:圆括号“( ”和“ )”、方括号“ [ ”和“ ] ”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的程序(已知表达式已存入数据元素为字符的顺序表中)。

Input

输入算术表达式,换行结束。

Output

若给定表达式中所含括号正确配对,则输出yes,否则输出no。

  • Sample Input 
    [5+(6-3)]-(2+3)]
  • Sample Output
    no
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
  
typedef struct Stack{  
    char data;  
    struct Stack *next;  
}Stack;  
  
Stack *create(){  
    Stack *q=(Stack *)malloc(sizeof(Stack));  
    q->next=NULL;  
    return q;  
}  
  
char getTop(Stack *s){  
    return s->next->data;  
}  
  
int equals(char a,char b){  
    if(a=='('&&b==')')return 1;  
    if(a=='['&&b==']')return 1;  
    if(a=='{'&&b=='}')return 1;  
    return 0;  
}  
  
void pop(Stack *s){  
    Stack *q=s->next;  
    s->next=q->next;  
    free(q);  
}  
  
void push(Stack *s,char b){  
    Stack *q=(Stack *)malloc(sizeof(Stack));  
    q->data=b;  
    q->next=s->next;  
    s->next=q;  
}  
int isEmpty(Stack *s){  
    if(s->next==NULL)return 1;  
    return 0;  
}  
  
int main(){  
    char str[105];  
    scanf("%s",str);  
    int i=0;  
    int len=strlen(str);  
    Stack *s=create();  
    if(str[0]=='['||str[0]==']'||str[0]=='{'||str[0]=='}'||str[0]=='('||str[0]==')')  
        push(s,str[0]);  
    for(i=1;i<len;i++){  
        if(!isEmpty(s)&&equals(getTop(s),str[i]))  
        {  
            pop(s);  
        }  
        else  
        {  
            if(str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}'||str[i]=='('||str[i]==')')  
                push(s,str[i]);  
        }  
    }  
    if(isEmpty(s)){  
        printf("yes\n");  
    }else{  
        printf("no\n");  
    }  
    return 0;  
}  

略有差别的第二种写法,加入了头指针

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct node{
    char data;
    struct node *next;
    struct node *top;
}Stack;

Stack *Create()
{
    Stack *q = (Stack *)malloc(sizeof(Stack));
    q->top = NULL;
    return q;
}

void push(Stack *s,char x)
{
    Stack *q = (Stack *)malloc(sizeof(Stack));
    q->data = x;
    q->next = s->top;
    s->top = q;
}

void pop(Stack *s)
{
    Stack *q = (Stack *)malloc(sizeof(Stack));
    q = s->top;
    int elem = s->data;
    s->top = s->top->next;
    free(q);
}

char getTop(Stack *s)
{
    return s->top->data;
}

int isEmpty(Stack *s)
{
    return (s->top == NULL);
}

int equals(char a,char b)//不能是a==b,是要匹配
{
    if(a=='('&&b==')')return 1;
    if(a=='['&&b==']')return 1;
    if(a=='{'&&b=='}')return 1;
    return 0;
}

int main()
{
    char str[105];
    scanf("%s",str);
    int i=0;
    int len=strlen(str);
    Stack *s=Create();
    if(str[0]=='['||str[0]==']'||str[0]=='{'||str[0]=='}'||str[0]=='('||str[0]==')')
        push(s,str[0]);
    for(i=1;i<len;i++){
        if(!isEmpty(s)&&equals(getTop(s),str[i]))
        {
            pop(s);
        }
        else
        {
            if(str[i]=='['||str[i]==']'||str[i]=='{'||str[i]=='}'||str[i]=='('||str[i]==')')
                push(s,str[i]);
        }
    }
    if(isEmpty(s))
    {
        printf("yes\n");
    }
    else{
        printf("no\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值