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

来源:互联网 发布:电脑有趣的软件 编辑:程序博客网 时间:2024/06/07 08:34

题目描述

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

输入

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

输出

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

示例输入

sin(20+10){[}]

示例输出

yesno



小贴士:本题因为输入的字符串中可能包括空格,所以在获取字符串时要使用gets( );切记不可用scanf();

算法:每当遇到左括弧让其进栈,如果遇到右括弧,如果此时栈为空则配对失败,输出no,否则输出栈顶元素,并 与该右括弧看是否配对,若失败则输出no并退出循环

如果没有退出循环,并且比较完所有字符时此时栈为空,则证明配对成功,若栈不为空,则失败;



具体源代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <malloc.h>#define STACKMAX 100<span style="white-space:pre"></span>//定义初始最大储存容量位100#define STACKCREATE 10<span style="white-space:pre"></span>//每次容量不足时一次增加10/*定义栈的类型*/
typedef struct{    char *top;    char *base;    int stacksize;}Sqstack;/*建立空表*/int Initstack(Sqstack &S){    S.base=(char *)malloc(STACKMAX*sizeof(char));//重新分配空间;    if(!S.base)exit(-1);                        //分配失败退出程序    S.top=S.base;    S.stacksize=STACKMAX;    return 1;}/*插入元素的函数(进栈)int Push(Sqstack &S,char e){    if(S.top-S.base>=S.stacksize)    {        S.base=(char*)realloc(S.base,(STACKCREATE+S.stacksize)*sizeof(char));        if(!S.base)exit(-1);        S.top=S.base+S.stacksize;        S.stacksize+=STACKCREATE;    }    *S.top++=e;    return 1;}/*出栈并返回栈顶值*/int Pop(Sqstack &S,char &e){    if(S.top==S.base)return 0;    e=*--S.top;    return 1;}/*Ïú»Ù—£*/void DestroyStack(Sqstack &S){    S.base=S.top;}int main(){    char a[60],e;    int i,n;    while(gets(a))    {        Sqstack S;        Initstack(S);        n=strlen(a);        for(i=0; i<n; i++)        {            if(a[i]=='('||a[i]=='['||a[i]=='{')//左括弧进栈            {                Push(S,a[i]);            }            else if(a[i]==')'||a[i]==']'||a[i]=='}')//出现右括弧出栈并比较            {                if(S.top==S.base)//栈内无左括弧,分配一定失败                {                    printf("no\n");                    break;                }                Pop(S,e);                if((e!='('&&a[i]==')')||(e!='{'&&a[i]=='}')||(e!='['&&a[i]==']'))                {                    printf("no\n");                    break;                }            }        }        if(i==n)        {           if(S.top!=S.base)            {                printf("no\n");            }            else printf("yes\n");        }        DestroyStack(S);    }    return 0;}




0 0
原创粉丝点击