括号的匹配
本次实践将用到顺序栈的算法库,点击此处参考。

本次实践要求:

假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。 
例如,输入2+(3+4)*2+{[3]}-8,输出匹配正确;输入2+(3+4*[2)+{[3]}-8,输出匹配错误。

提示: 
(1)遇到左括号入栈,遇到右括号后,出栈一个符号,看是否配对。若配对,继续,直到读完所有的符号,栈也正好为空。若在中间出现一个不配对的,或者____,则可以得出不配对的结论。 
(2)也可以设计一个返回值为布尔型的函数,参数为要配对的表达式,为一个字符串。

实现源代码如下:
//*Copyright  (c)2017,烟台大学计算机与控制工程学院*                 
//*All rights reservrd.*                 
//*文件名称 :main.cpp*                 
//*作者:田长航*              
//*完成时间:2017年11月2日*                  
//*版本号:v1.0*              
//*问题描述:测试函数*                 
//*输入描述:无*                 
//*程序输出:无*
#include <stdio.h>  
#include "sqstack.h"  
  
bool isMatch(char *st)  
{  
    int d=1, i;  
    char c;  
    SqStack *s;  
    InitStack(s);  
    for(i=0; st[i]!='\0'&&d; i++)  
    {  
        switch(st[i])  
        {  
        case'(':  
        case'[':  
        case'{':  
            Push(s, st[i]);  
            break;  
        case')':  
            Pop(s, c);  
            if(c!='(') d=0;  
            c='0';  
            break;  
        case']':  
            Pop(s, c);  
            if(c!='[') d=0;  
            c='0';  
            break;  
        case'}':  
            Pop(s,c);  
            if(c!='{') d=0;  
            c='0';  
            break;  
        }  
    }  
    if(StackEmpty(s)&&d==1)  
        return true;  
    else  
        return false;  
}  
  
int main()  
{  
  
    char st[50];  
    printf("请输入表达式:");  
    scanf("%s", st);  
    if(isMatch(st))  
        printf("配对正确!!\n");  
    else  
        printf("配对错误!!\n");  
    return 0;  
}  


运行结果如下:

更多推荐