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

来源:互联网 发布:一流演员 知乎 编辑:程序博客网 时间:2024/06/14 18:57

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

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

sin(20+10){[}]

示例输出

yesno

提示

 

来源

ma6174

示例程序

这个题一开始提交了好几遍都wa,后来看到题中说字符串中包括空格,瞬间明悟了,泪奔.......,马上改输入

#include<stdio.h>#include<string.h>int main(){    char str[100];    char arr[100];    int top;    while(gets(str)!=NULL)    {        top = -1;        for(int i = 0;str[i] != '\0';i++)        {            if(str[i] == '(' || str[i] == '{' || str[i] == '[')            {                ++top;                arr[top] = str[i];            }            else if(str[i] == ')')            {                if(arr[top] == '(')                {                    top--;                }                else                {                    ++top;                    arr[top] = str[i];                    break;                }            }            else if(str[i] == '}')            {                if(arr[top] == '{')                {                    top--;                }                else                {                    ++top;                    arr[top] = str[i];                    break;                }            }            else if(str[i] == ']')            {                if(arr[top] == '[')                {                    top--;                }                else                {                    ++top;                    arr[top] = str[i];                    break;                }            }        }        if(str[0] != '\0' && top == -1)            printf("yes\n");        else if(str[0] != '\0')            printf("no\n");    }    return 0;}

这个是用栈来做的

#include<stdio.h>#include<stdlib.h>#include<string.h>#define stackmax 10000#define stacknum 10000typedef struct{    char *top;    char *base;    int stacksize;}stack;int initstack(stack &s){    s.base = (char *)malloc(stackmax*sizeof(char));    if(!s.base) exit(0);    s.top = s.base;    s.stacksize = stackmax;    return 1;}void push(stack &s,char e){    if(s.top - s.base > s.stacksize)    {        s.base = (char *)realloc(s.base,(s.stacksize + stacknum)*sizeof(char));        if(!s.base) exit(0);        s.top = s.base + s.stacksize;        s.stacksize += stacknum;    }    s.top++;    *s.top = e;}void pop(stack &s){    s.top--;}void choose(stack &s,char str[]){    int i;    int f = 0;    char e;    for(i = 0;str[i] != '\0';i++)    {        if(str[i] == '(' || str[i] == '{' || str[i] == '[')        {            push(s,str[i]);        }        else if(str[i] == ')')        {            e = *s.top;            if(e == '(')            {                pop(s);            }            else            {                f = 1;                break;            }        }        else if(str[i] == '}')        {            e = *s.top;            if(e == '{')            {                pop(s);            }            else            {                f = 1;                break;            }        }        else if(str[i] == ']')        {            e = *s.top;            if(e == '[')            {                pop(s);            }            else            {                f = 1;                break;            }        }    }    if(!f && s.top == s.base)        printf("yes\n");    else        printf("no\n");}int main(){    char str[1000];    stack s;    while(gets(str)!=NULL)    {        initstack(s);        choose(s,str);    }    return 0;}


0 0