栈应用—括号匹配问题

括号匹配问题

  • 问题:假设表达式中括号可以任意嵌套,例如【()【()】】都是合法的。但是要求括号必须成对出现,像【(】)或者(【))的形式都是非法。编写一个程序,从终端输入一组括号,以字符 ‘#’ 为结束标志,判断输入的括号是否匹配合法。
  • 解决思路:
  • 1、首先输入1个字符,当该字符不是 ’#‘ 时,程序进入循环中。
  • 2、进入循环之后,首先判断栈是否为空。如果栈为空,则说明用户输入的括号字符是第一个,因此将他保存在栈中。如果栈不为空,要求将栈顶元素取出,判断栈顶元素是否刚才输入的括号字符相匹配。如果匹配,则继续执行下一个字符;如果不匹配,则必须先将刚才取出的栈顶元素重新入栈,再将刚才输入的括号也入栈,然后再输入下一个字符。
  • 3、重复上面的操作,直到输入结束标志 ’#‘ 为止。

先封装一个栈

#pragma once
#include<assert.h>
#include<stdlib.h>

//1. 封装栈的基本操作
建议:静态 
typedef char SDataType;

#define MAXSIZE 100 

typedef struct Stack
{
    SDataType _array[MAXSIZE];
    int _top; // 标记栈顶(栈中元素的个数) 
}Stack;


void StackInit(Stack* ps)
{
    assert(ps);
    ps->_top = 0;
}

void StackPush(Stack* ps, SDataType data)
{
    assert(ps != NULL);
    if (MAXSIZE == ps->_top)
        return;
    ps->_array[ps->_top] = data;
    ps->_top++;
}
void StackPop(Stack* ps)
{
    assert(ps != NULL);
    if (StackEmpty(ps))
        return;
    ps->_top--;

}

SDataType StackTop(Stack* ps)
{
    assert(ps != NULL);
    return ps->_array[--(ps->_top)];
}

int StackSize(Stack* ps)
{
    assert(ps);
    return ps->_top;
}

int StackEmpty(Stack* ps)
{
    if (ps->_top == 0)
        return 1;
    else
        return 0;
}

思路:括号匹配的主要思路

#pragma once
#include"stack.h"

2. 栈的应用
//用栈解决括号的匹配问题
int match(char a, char b)
{
    if ((a == '( ' && b == ')') || (a == '['&&b == ']') || (a == '{'&&b == '}'))
        return 1;
    else return 0;
}

int main()
{
    Stack stack;
    char c, e;
    StackInit(&stack);

    scanf("%c", &c);
    while (c != '#')
    {
        if (StackEmpty(&stack))
            StackPush(&stack, c);
        else
        {
            e = StackTop(&stack);
            if (!match(e, c))
                StackPush(&stack, c);
            else
                StackPop(&stack, e);
        }
        scanf("%c", &c);
    }
    if (StackEmpty(&stack))
        printf("The brackets are matched!\n");
    else
        printf("The brackets are not matched!\n");

    system("pause");
}

代码经过测试,测试正确。如有问题,还请大佬们指点指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值