设一个算术表达式中包含圆括号、方括号和花括号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; 
}


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

你主要问题是不能在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


#include <iostream>
#include <string>
#include <stack>
 
bool match(const std::string & s);
 
int main()
{
    std::string line;
    getline(std::cin, line);
    std::cout << match(line) << std::endl;
 
    return 0;
}
 
bool match(const std::string & s)
{
    std::stack<char> stk;
    for (int i = 0; i < (int)s.length(); ++i) {
        char c = s[i];
        switch (c) {
        case '(':
        case '[':
        case '{':
            stk.push(c);
            break;
        case ')':
            if (stk.empty() || stk.top() != '(') {
                return false;
            }
            stk.pop();
            break;
        case ']':
            if (stk.empty() || stk.top() != '[') {
                return false;
            }
            stk.pop();
            break;
        case '}':
            if (stk.empty() || stk.top() != '{') {
                return false;
            }
            stk.pop();
            break;
        default:
            break;
        }
    }
    return stk.empty();
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632