括号组匹配问题

问题:

        输入一个符号组,如:"()[]{}"。判断该输入是否合法。

函数功能:

        symbolJudge函数: 

        判断符号函数判断一下预压入栈内的符号与栈顶符号是否为一对。

        若为一对,则弹出栈顶符号,返回0,表示压栈操作不执行。

        若非一对,则需要压入栈内,返回1,表示压栈操作执行。

注:

        我在写代码的时候没有加入过多的判断语句,例如:栈底如果是“}、)、>”这些符号的时候,直接结束程序,报符号组不合法。读者有这个需求的话,可自行添加。栈的容量我只设置了20个,读者如果需要扩展栈容量的话,自行添加代码。

判断符号是否匹配的时候,可以对照ASCII表,因为这些符号组在表内对应的十进制数大多都有规律,依照这个规律可以大大减少代码量。

代码实现:

#include <stdio.h>
#include <stdlib.h>

#define TRUE            1
#define FALSE           0
#define STACK_INIT_SIZE 20

typedef int Status;
typedef char ElemType;

typedef struct sqStack
{
    ElemType *top;
    ElemType *base;
    int stackSize;
} sqStack;

void stackInit(sqStack *stack);
void destroyStack(sqStack *stack);
void Push_Pop(sqStack *stack, ElemType e);
Status symbolJudge(sqStack *stack, ElemType e);

void stackInit(sqStack *stack)
{
    stack->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!stack->base)
    {
        printf("初始化失败!\n");
        exit(1);
    }
    stack->top = stack->base;
    stack->stackSize = STACK_INIT_SIZE;
}

/*
    判断符号函数
    判断一下预压入栈内的符号与栈顶符号是否为一对。
    若为一对,则弹出栈顶符号,返回0,表示压栈操作不执行。
    若非一对,则压入栈内,返回1,表示压入栈内。
*/
Status symbolJudge(sqStack *stack, ElemType e)
{
    ElemType last;      // 记录栈顶元素
    if (stack->top == stack->base)
    {
        // 说明栈为空
        return TRUE;
    }
    /*
        使用--stack->top 拿到栈顶符号,判断得如果符号是一对,
        那么--stack->top 就已经相当于 把栈顶元素弹出了。
    */
    last = *(--stack->top);
    if (e == last || e-1 == last || e-2 == last)    // 判断符号是否为一对
    {
        // 说明栈顶符号与预压入栈的符号是一对。
        return FALSE;
    }
    stack->top++;
    return TRUE;
}

/* 
    执行压栈或弹出的函数
    压栈前先判断一下栈内最顶部的符号与预压入栈的符号是否为一对。
    若为一对,则将栈顶符号弹出。
    否则,压入栈内。
*/
void Push_Pop(sqStack *stack, ElemType e)
{
    int flag = symbolJudge(stack, e);
    if (flag)
    {
        *(stack->top) = e;
        stack->top ++;
    }
}

// 销毁栈
void destroyStack(sqStack *stack)
{
    free(stack->base);
    stack->base = stack->top = NULL;
    stack->stackSize = 0;
    printf("栈已销毁!\n");
}

int main(void)
{
    char input;
    sqStack stack;
    stackInit(&stack);
    printf("输入符号组(#为结束符):");
    do
    {
        scanf("%c", &input);
        if (input != '#') Push_Pop(&stack, input);
        
    } while (input != '#');
    
    getchar(); // 清空缓冲区

    if (stack.top - stack.base == 0)
    {
        printf("符号组合法!\n");
    }
    else
    {
        printf("符号组不合法!\n");
    }
    destroyStack(&stack);
    return 0;
}

  运行结果:

        例(1)

        输入符号组(#为结束符):"["]{([])}#
        符号组不合法!
        栈已销毁!

        例(2)

        输入符号组(#为结束符):"[]{("{}")}"#
        符号组合法!
        栈已销毁!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值