第五周项目3-括号的匹配

/* 
 
copyright (t) 2016,烟台大学计算机学院 
 
*All rights reserved. 
 
*文件名称:1.cpp 
 
*作者:臧新晓 
 
*完成日期:2016年10月9日 
 
*版本号:v1.0 
 
*问题描述:假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。例如,输入2+(3+4)*[2+{[3]}]-8,输出匹配正确;输入2+(3+4*[2)+{[3]}-8,输出匹配错误。 
 
*输入描述:一串合法的表达式 
 
*程序输出:括号配对结果(匹配正确/匹配错误) 
 
*/  


#include <stdio.h>  
#include <malloc.h>  
#include <string.h>  
typedef char Elemtype;  
typedef struct node  
{  
    int data;  
    struct node *next;  
} LiStack;  
void InitStack(LiStack *&l)  
{  
    l=(LiStack *)malloc(sizeof(LiStack));  
    l->next=NULL;  
}  
void DestroyStack(LiStack *&l)  
{  
    LiStack *pre=l,*p=l->next;  
    while(p!=NULL)  
    {  
        free(pre);  
        pre=p;  
        p=p->next;  
    }  
    free(pre);  
}  
bool StackEmpty(LiStack *l)  
{  
    return (l->next==NULL);  
}  
void Push(LiStack *&l,Elemtype e)  
{  
    LiStack *p;  
    p=(LiStack *)malloc(sizeof(LiStack));  
    p->data=e;  
    p->next=l->next;  
    l->next=p;  
}  
bool Pop(LiStack *&l,Elemtype &e)  
{  
    LiStack *p;  
    if(l->next==NULL)  
        return false;  
    p=l->next;  
    e=p->data;  
    l->next=p->next;  
    free(p);  
    return true;  
}  
bool GetTop(LiStack *l,Elemtype &e)  
{  
    if(l->next==NULL)  
        return false;  
    e=l->next->data;  
    return true;  
}  
bool match1(Elemtype exp[],int n)  
{  
    int i=0;  
    char e;  
    bool match=true;  
    LiStack *st;  
    InitStack(st);                //初始化栈  
    while(i<n && match)           //扫描exp中的所有字符  
    {  
        if(exp[i]=='(')           //当前字符为左括号,进栈  
            Push(st,exp[i]);  
        else if(exp[i]==')')      //当前字符为右括号  
        {  
            if(GetTop(st,e)==true)//能够取出栈顶元素  
            {  
                if(e!='(')        //栈顶元素不为'('时表示不匹配  
                    match=false;  
                else              //匹配,将栈顶元素出栈  
                    Pop(st,e);  
            }  
            else  
                match=false;      //无法取出栈顶元素,表示不匹配  
        }  
        i++;  
    }  
    if(!StackEmpty(st))           //最后栈不空时,表示不匹配  
        match=false;  
    DestroyStack(st);             //销毁栈  
    return match;  
}  
bool match2(Elemtype exp[],int n)  
{  
    int i=0;  
    char e;  
    bool match=true;  
    LiStack *st;  
    InitStack(st);                //初始化栈  
    while(i<n && match)           //扫描exp中的所有字符  
    {  
        if(exp[i]=='[')           //当前字符为左括号,进栈  
            Push(st,exp[i]);  
        else if(exp[i]==']')      //当前字符为右括号  
        {  
            if(GetTop(st,e)==true)//能够取出栈顶元素  
            {  
                if(e!='[')        //栈顶元素不为'['时表示不匹配  
                    match=false;  
                else              //匹配,将栈顶元素出栈  
                    Pop(st,e);  
            }  
            else  
                match=false;      //无法取出栈顶元素,表示不匹配  
        }  
        i++;  
    }  
    if(!StackEmpty(st))           //最后栈不空时,表示不匹配  
        match=false;  
    DestroyStack(st);             //销毁栈  
    return match;  
}  
bool match3(Elemtype exp[],int n)  
{  
    int i=0;  
    char e;  
    bool match=true;  
    LiStack *st;  
    InitStack(st);                //初始化栈  
    while(i<n && match)           //扫描exp中的所有字符  
    {  
        if(exp[i]=='{')           //当前字符为左括号,进栈  
            Push(st,exp[i]);  
        else if(exp[i]=='}')      //当前字符为右括号  
        {  
            if(GetTop(st,e)==true)//能够取出栈顶元素  
            {  
                if(e!='{')        //栈顶元素不为'{'时表示不匹配  
                    match=false;  
                else              //匹配,将栈顶元素出栈  
                    Pop(st,e);  
            }  
            else  
                match=false;      //无法取出栈顶元素,表示不匹配  
        }  
        i++;  
    }  
    if(!StackEmpty(st))           //最后栈不空时,表示不匹配  
        match=false;  
    DestroyStack(st);             //销毁栈  
    return match;  
}  
int main()  
{  
    Elemtype a[1000];  
    int n;  
    while(gets(a))  
    {  
        n=strlen(a);  
        if(match1(a,n) && match2(a,n) && match3(a,n))  
            printf("匹配正确!\n");  
        else  
            printf("匹配错误!\n");  
    }  
    return 0;  
}  




知识点总结:

        链栈的应用问题



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值