数据结构-C语言 栈的简单应用——括号匹配

来源:互联网 发布:mac的桌面壁纸 编辑:程序博客网 时间:2024/05/21 22:28

题目很简单:假设表达式中允许包含三中括号:( ),[ ],{ },其嵌套顺序任意,如{ [ ( [ ] [ ] ) ] },为正确的格式,[ ( ] )为不正确的格式。

将输入的括号字符进行判断:若输入为左括号则压入栈,若为右括号则与栈顶的左括号进行配对。

若配对成功,则将栈顶的左括号弹出,继续下一次判断。

若配对不成功,则栈无法弹空。

当输入完成后,可能有多余的右括号,此时设置一个辅助变量sts=1,当栈空且输入为右括号时,sts=0,并提示配对失败;

程序最后判断,若栈空且sts=1则所有括号配对成功,若栈不空则配对失败。

以下是代码实现:

#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int Status;typedef char SElement;typedef struct SqStack//定义栈{    SElement *base;    SElement *top;    int stacksize;}SqStack;Status InitStack(SqStack *s)//初始化栈{    s->base=(SElement*)malloc(STACK_INIT_SIZE*sizeof(SElement));    if (!s->base)        return 0;    s->top=s->base;    s->stacksize=STACK_INIT_SIZE;    return 1;}Status Push(SqStack *s, SElement e)//入栈{    if (s->top-s->base>=s->stacksize)    {        s->base=(SElement*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElement));        if (!s->base)            return 0;        s->top=s->base+s->stacksize;        s->stacksize+=STACKINCREMENT;    }    *s->top++=e;    return 1;}Status Pop(SqStack *s, SElement *e)//出栈{    if (s->top==s->base)        return 0;    *e=*--s->top;    return 1;} Status GetTop(SqStack S,SElement *e)//获取栈顶元素 {   if(S.top>S.base)   {     *e=*(S.top-1);     return 1;   }   else return 0; }Status StackEmpty(SqStack *s)//栈空{    if (s->base==s->top)        return 1;    return 0;}void Check()//匹配函数{    Status sts=1;//1则匹配,0则不匹配    SqStack S;    SElement tin, ttop, e;//temp作输入的小房间,ttop作为栈顶元素,e作为垃圾箱    InitStack(&S);    scanf("%c",&tin);    while (tin!='\n')    {        //如果输入为左括号就将其压入栈中        if (tin=='('||tin=='['||tin=='{')         Push(&S, tin);           //再次输入         scanf("%c",&tin);        if ((tin==')'||tin==']'||tin=='}')&&StackEmpty(&S)==1)//如果栈空且再次输入为右括号则不匹配,sts=0        {            sts=0;            printf("ERROR\n");            break;        }         //获取栈顶元素         GetTop(S, &ttop);         //如果栈顶元素与再次输入的元素匹配就把栈顶元素弹出         if (ttop=='('&&tin==')')            Pop(&S, &e);        else  if (ttop=='['&&tin==']')            Pop(&S,&e);        else  if (ttop=='{'&&tin=='}')            Pop(&S,&e);          }          if (StackEmpty(&S)&&sts==1)//栈空且匹配            printf("OK\n");          else if(!StackEmpty(&S))//栈不空不匹配            printf("ERROR\n");}int main()//主程序{    Check();    printf("******************************Programmed by DXH924*****************************");}



阅读全文
0 0
原创粉丝点击