括号匹配

空扰寡人 提交于 2019-11-30 14:01:32

⭐ 我的网站: www.mengyingjie.com ⭐

编写程序检查该字符串的括号是否成对出现,而且不能交叉出现。
输入:
一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,“#”结束
输出:
成功:代表括号成对出现并且嵌套正确
失败:未正确使用括号字符。

分析

用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。
栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。
栈的特性:后进先出(LIFO)
由于正在学数据结构,于是栈的定义与操作都是自己编写的,为了巩固概念

代码

#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define bool int
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0
#define SElemType char

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

//------基本操作的函数原型说明------

bool InitStack(SqStack *S);
    //构建一个空栈
bool DestroryStack(SqStack *S);
    //销毁栈S S 不再存在
bool ClearStack(SqStack *S);
    //让S 变成一个空栈
bool StackEmpty(SqStack *S);
    //判断S是否为空栈 ,为空栈返回true 否则返回false
int StackLength(SqStack S);
    //返回S的元素个数,及为S的长度
bool GetTop(SqStack S);
    //若栈不为空,返回栈顶元素,并返回true 否则返回 false
bool Push(SqStack *S,SElemType e);
    //插入元素 违心的栈顶元素
bool Pop(SqStack *S,SElemType *e);
    //若栈不为空,则删除栈顶元素,用e返回其值,返回true, 否则返回false
bool StackTraverse(SqStack S,bool(*vist)());
    //从栈底到栈顶依次对每一个元素visit(),一旦visit失败,则操作失败

//------基本操作的算法描述------
InitStack(SqStack *S)
{
    S->base = (SElemType *)malloc(STACK_INT_SIZE*sizeof(SElemType));
    if(!S->base) return 0;
    S->top = S->base;
    S->stacksize = STACK_INT_SIZE;
    return 1;
}

GetTop(SqStack S)
{
    if(S.top==S.base) return 0;

    return *(S.top-1);
}

Push(SqStack *S,SElemType e)
{
    if(S->top - S->base>=S->stacksize) //如果栈满  需要增加空间
    {
        S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
        if(!S->base) return 0;
        S->top = S->base + S->stacksize;
        S->stacksize +=STACKINCREMENT;
    }
    *(S->top++)=e;
    return 1;
}

Pop(SqStack *S,SElemType *e)
{
    if(S->top==S->base) return 0;
    *e = *(--S->top);
    return 1;
}

int CheckChar(char c, char OP[])
{
    int i;
    for(i=0; i<3; i++)
        if(c==OP[i])return i;
    return 999;
}

int main()
{
    SqStack OPTR;
    InitStack(&OPTR);
    Push(&OPTR,'#');
    printf("输入括号以“#”结尾\n");
    char c;
    c=getchar();
    int m=1;          //判断最终是否完全匹配   完全匹配  值为1,否则为0
    char OP1[] = {'[','(','{'};
    char OP2[] = {']',')','}'};
    while(c!='#')
    {
        if(CheckChar(c,OP1)<3)
        {
            Push(&OPTR,c);
            c=getchar();
        }
        else
        {
            if(CheckChar(GetTop(OPTR),OP1)==CheckChar(c,OP2))
            {
                //printf(" -+ ");
                Pop(&OPTR,&c);
                c=getchar();
                continue;
            }
            else
            {
                m=0;
                break;
            }
        }

    }
    if(GetTop(OPTR)!=c)m=0;
    if(m==1)printf("\n括号完全匹配!");
    else printf("\n括号匹配失败!");
    return 0;
}

遇到此类问题,但看了文章还是未解决,
评论或加 QQ:781378815

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!