顺序栈之判断输入的表达式中括号是否配对

问题描述
编写一个算法判断输入的表达式中括号是否配对(假设只含有左、右圆括号)编写一个算法判断输入的表达式中括号是否配对(假设只含有左、右圆括号)

输入:
(1+2*(5+3)/2)

输出:
(1+2*(5+3)/2) 是括号匹配的

代码实现1

#include <iostream>
#include <string.h>

using namespace std;

typedef char ElemType;

typedef struct linknode
{
    ElemType data;
    struct linknode *next;
}LinkStNote;


void InitStack(LinkStNote *&s)
{
    s = (LinkStNote *)malloc(sizeof(LinkStNote));
    s->next = NULL;
}

void DestoryStack(LinkStNote * &s)
{
    LinkStNote *pre = s, *p = s->next;
    while(p != NULL)
    {
        free(pre);
        pre = p;
        p = pre->next;

    }
    free(pre);
}

bool StackEmpty(LinkStNote * s)
{
    return (s->next == NULL);
}

void Push(LinkStNote *&s, ElemType e)
{
    LinkStNote *p;
    p = (LinkStNote *)malloc(sizeof(LinkStNote));
    p->data = e;
    p->next = s->next;
    s->next = p;
}

bool Pop(LinkStNote *&s, ElemType &e)
{
    LinkStNote *p;
    if(s->next == NULL)
    {
        return false;
    }
    p = s->next;
    e = p->data;
    s->next = p->next;
    free(p);
    return true;
}

bool GetTop(LinkStNote *s, ElemType &e)
{
    if(s->next == NULL)
    {
        return false;
    }
    e = s->next->data;
    return true;
}

bool Match(string exp, int n)
{
    int i = 0;
    char e;
    bool match = true;
    LinkStNote *st;
    InitStack(st);
    while(i < n && match)
    {
        if(exp[i] == '(')
        {

            Push(st, exp[i]);
        }else if(exp[i] == ')')
        {
            if(GetTop(st, e) == true)
            {
                if(e != '(')
                    match = false;
                else
                    Pop(st, e);
            }
            else match = false;
        }
        i++;
    }
    if(!StackEmpty(st))
    {
        match = false;
    }
    DestoryStack(st);

    return match;
}




int main()
{
    string exp;
    //从控制台输入字符串
    cin>>exp;
    if(Match(exp, exp.length()) == 1)
        cout<<exp<<" 是括号匹配的";
    else
        cout<<exp<<" 不是括号匹配的";

    return 0;
}


代码实现2

#include <iostream>
#include <string.h>

using namespace std;

typedef char ElemType;

typedef struct linknode
{
    ElemType data;
    struct linknode *next;
}LinkStNote;


void InitStack(LinkStNote *&s)
{
    s = (LinkStNote *)malloc(sizeof(LinkStNote));
    s->next = NULL;
}

void DestoryStack(LinkStNote * &s)
{
    LinkStNote *pre = s, *p = s->next;
    while(p != NULL)
    {
        free(pre);
        pre = p;
        p = pre->next;

    }
    free(pre);
}

bool StackEmpty(LinkStNote * s)
{
    return (s->next == NULL);
}

void Push(LinkStNote *&s, ElemType e)
{
    LinkStNote *p;
    p = (LinkStNote *)malloc(sizeof(LinkStNote));
    p->data = e;
    p->next = s->next;
    s->next = p;
}

bool Pop(LinkStNote *&s, ElemType &e)
{
    LinkStNote *p;
    if(s->next == NULL)
    {
        return false;
    }
    p = s->next;
    e = p->data;
    s->next = p->next;
    free(p);
    return true;
}

bool GetTop(LinkStNote *s, ElemType &e)
{
    if(s->next == NULL)
    {
        return false;
    }
    e = s->next->data;
    return true;
}

bool Match(char exp[], int n)
{
    int i = 0;
    char e;
    bool match = true;
    LinkStNote *st;
    InitStack(st);
    while(i < n && match)
    {
        if(exp[i] == '(')
        {

            Push(st, exp[i]);
        }else if(exp[i] == ')')
        {
            if(GetTop(st, e) == true)
            {
                if(e != '(')
                    match = false;
                else
                    Pop(st, e);
            }
            else match = false;
        }
        i++;
    }
    if(!StackEmpty(st))
    {
        match = false;
    }
    DestoryStack(st);

    return match;
}




int main()
{
    char exp[50];
    //从控制台输入字符串
    gets(exp);
    if(Match(exp, strlen(exp)) == 1)
        cout<<exp<<"是括号匹配的";
    else
        cout<<exp<<"不是括号匹配的";

    return 0;
}


运行结果1
在这里插入图片描述
运行结果2
在这里插入图片描述

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用顺序栈判断表达式的括号是否正确配对。具体步骤如下: 1. 创建一个空的顺序栈,用于存储左括号。 2. 从左到右遍历表达式的每个字符,如果遇到左括号(圆括号、方括号或大括号),则将其入栈。 3. 如果遇到右括号,判断栈顶元素是否与该右括号匹配。如果匹配,则将栈顶元素出栈;否则,表达式的括号不匹配,返回错误。 4. 遍历完整个表达式后,如果栈为空,则表达式的括号全部匹配;否则,表达式的括号不匹配,返回错误。 下面是一个示例代码: ``` bool isMatched(string expr) { stack<char> s; for (int i = ; i < expr.length(); i++) { char c = expr[i]; if (c == '(' || c == '[' || c == '{') { s.push(c); } else if (c == ')' || c == ']' || c == '}') { if (s.empty()) { return false; } char top = s.top(); s.pop(); if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) { return false; } } } return s.empty(); } ``` 该函数接受一个表达式字符串作为参数,返回一个布尔值,表示表达式的括号是否正确配对。在函数,使用了一个字符类型的栈来存储左括号,遍历表达式字符串的每个字符,如果遇到左括号,则将其入栈;如果遇到右括号,则判断栈顶元素是否与该右括号匹配,如果匹配,则将栈顶元素出栈;否则,表达式的括号不匹配,返回错误。最后,如果栈为空,则表达式的括号全部匹配;否则,表达式的括号不匹配,返回错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值