qq_39677327 2022-05-08 18:08 采纳率: 94.9%
浏览 930
已结题

设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法判断其中的括号是否匹配。

设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法判断其中的括号是否匹配。
问题:当输入{()}时程序提示不匹配,改了半天不知道咋改,有专家帮帮忙么

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef char Element;
struct stack
{
    Element *data;
    int top=-1;
};
bool is(stack s)
{
    if(s.top==-1)
    return true;
    else
    return false;
}
void push(stack &s,Element data)
{
    ++s.top; 
    s.data=new Element;
    s.data[s.top]=data;
}
void pop(stack &s,Element &data)
{
    if(is(s)!=true)
    {
        data=s.data[s.top];
        s.top--;
    }
}
int compare(Element *str)
{
    int count=0;
    Element data;
    stack s;
    while(str[count]!=NULL)
    {
        switch(str[count])
        {
            case'(':
                push(s,str[count]);
                break;
            case'[':
                push(s,str[count]);
                break;
            case'{':
                push(s,str[count]);
                break;
            case')':
                pop(s,data);
                if(data!='(')
                return 0;
                break;
            case']':
                pop(s,data);
                if(data!='[')
                return 0;
                break;
            case'}':
                pop(s,data);
                if(data!='{')
                return 0;
                break;
        }
        count++; 
    } 
    if(is(s)==true) 
    return 1;
    else
    return 0;
}
int main()
{
    Element *str;
    int length,result;
    cout<<"请输入算术表达式的长度:";
    cin>>length;
    cout<<endl;
    str= new Element(length); 
    cout<<"请输入算法表达式:";
    for(int i=0;i<length;i++)
    cin>>str[i];
    result=compare(str);
    switch(result)
    {
        case 0:
            cout<<"算法表达式中括号不匹配"<<endl;
            break;
        case 1:
            cout<<"算法表达式中括号匹配"<<endl;
            break;
    }
    system("pause");
    return 0; 
}


  • 写回答

3条回答 默认 最新

  • 关注

    遇到({[左括号入栈,遇到)]}右括号出栈、最后判断栈是不是为空

    你主要问题是不能在push()用 s.data=new Element; 每次都对s.data重新赋值
    应该用一个init()初始化函数对s.data初始赋值一次
    void init(stack &s,int n)
    {
    s.data=new Element(n);
    s.top=-1;
    }
    void push(stack &s,Element data)
    {
    ++s.top;
    s.data[s.top]=data;
    }

    遇到)]}右括号时、要先判断栈是不是为空 if(is(s)) return 0;

    你题目的解答代码如下:

    #include<iostream>
    #include<stdlib.h>
    #include<stdio.h>
    using namespace std;
    typedef char Element;
    struct stack
    {
        Element *data;
        int top=-1;
    };
    bool is(stack s)
    {
        if(s.top==-1)
        return true;
        else
        return false;
    }
    void init(stack &s,int n)
    {
        s.data=new Element(n);
        s.top=-1;
    }
    void push(stack &s,Element data)
    {
        ++s.top;
        s.data[s.top]=data;
    }
    void pop(stack &s,Element &data)
    {
        if(is(s)!=true)
        {
            data=s.data[s.top];
            s.top--;
        }
    }
    int compare(Element *str)
    {
        int count=0;
        Element data;
        stack s;
        init(s,100);
        while(str[count]!=0)
        {
            switch(str[count])
            {
                case '(':
                    push(s,str[count]);
                    break;
                case '[':
                    push(s,str[count]);
                    break;
                case '{':
                    push(s,str[count]);
                    break;
                case ')':
                    if(is(s)) return 0;
                    pop(s,data);
                    if(data!='(')
                    return 0;
                    break;
                case ']':
                    if(is(s)) return 0;
                    pop(s,data);
                    if(data!='[')
                    return 0;
                    break;
                case '}':
                    if(is(s)) return 0;
                    pop(s,data);
                    if(data!='{')
                    return 0;
                    break;
            }
            count++;
        }
        if(is(s)==true)
        return 1;
        else
        return 0;
    }
    int main()
    {
        Element *str;
        int i,length,result;
        cout<<"请输入算术表达式的长度:";
        cin>>length;
        cout<<endl;
        str= new Element(length);
        cout<<"请输入算法表达式:";
        for(i=0;i<length;i++)
            cin>>str[i];
        str[i]=0;
        result=compare(str);
        switch(result)
        {
            case 0:
                cout<<"算法表达式中括号不匹配"<<endl;
                break;
            case 1:
                cout<<"算法表达式中括号匹配"<<endl;
                break;
        }
        system("pause");
        return 0;
    }
    

    如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月16日
  • 已采纳回答 5月8日
  • 修改了问题 5月8日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 qc代码,修改和添加东西
  • ¥50 Unity的粒子系统使用shadergraph(内置管线)制作的一个顶点偏移shader,但是粒子模型移动时,顶点也会偏移
  • ¥15 如何用python处理excel的数据(极值标准化)
  • ¥15 三向应力状态求剪应力
  • ¥15 jupyter notebook如何添加libGL.so.1库
  • ¥20 easyPoi能否实现下拉多选或者复选框
  • ¥15 网桥在转发帧时,会变帧的源地址和目的地址吗?
  • ¥15 用Multisim设计汽车尾灯控制电路
  • ¥100 求用matlab求解上述微分方程的程序代码
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码