/***链栈实现括号匹配***/

/链栈实现括号匹配/

#include
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char SElemType;
typedef int Status;
typedef struct SNode {
int data;
struct SNode *next;
} SNode, *LinkStack;

Status InitStack(LinkStack &S) {//初始化栈
S = NULL;
return OK;
}
bool StackEmpty(LinkStack S) {//判断栈是否为空
if (!S)
return true;
return false;
}
Status Push(LinkStack &S, SElemType e) {//入栈
SNode *p = new SNode;
if (!p) {
return OVERFLOW;
}
p->data = e;
p->next = S;
S = p;
return OK;
}
Status Pop(LinkStack &S, SElemType &e) {//出栈
SNode *p;
if (!S)
return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}
Status GetTop(LinkStack &S) {//取栈顶元素
if (!S)
return ERROR;
return S->data;
}

//算法3.21 括号的匹配
Status Matching() {//检验表达式中所含括号是否正确匹配,如果匹配,则返回true,否则返回false
//表达式以“#”结束

}
int main() {
LinkStack S;
cout << "请输入待匹配的表达式,以“#”结束:" << endl;
int flag = (int) Matching();
if (flag)
cout << "括号匹配成功!" << endl;
else
cout << "括号匹配失败!" << endl;
return 0;
}

这个怎么改啊,求解答

你题目的解答代码如下:

#include <iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char SElemType;
typedef int Status;
typedef struct SNode
{
    int data;
    struct SNode *next;
} SNode, *LinkStack;

Status InitStack(LinkStack &S)
{ //初始化栈
    S = NULL;
    return OK;
}
bool StackEmpty(LinkStack S)
{ //判断栈是否为空
    if (!S)
        return true;
    return false;
}
Status Push(LinkStack &S, SElemType e)
{ //入栈
    SNode *p = new SNode;
    if (!p)
    {
        return OVERFLOW;
    }
    p->data = e;
    p->next = S;
    S = p;
    return OK;
}
Status Pop(LinkStack &S, SElemType &e)
{ //出栈
    SNode *p;
    if (!S)
        return ERROR;
    e = S->data;
    p = S;
    S = S->next;
    delete p;
    return OK;
}
Status GetTop(LinkStack &S)
{ //取栈顶元素
    if (!S)
        return ERROR;
    return S->data;
}

//算法3.21 括号的匹配
Status Matching()
{ //检验表达式中所含括号是否正确匹配,如果匹配,则返回true,否则返回false
    //表达式以“#”结束
    LinkStack S;
    SElemType ch,ch2;
    InitStack(S);
    cin >> ch;
    while (ch!='#')
    {
        switch(ch){
            case '(':
                Push(S, ')');
                break;
            case '{':
                Push(S, '}');
                break;
            case '[':
                Push(S, ']');
                break;
            case '}':
            case ']':
            case ')':
                if(StackEmpty(S))
                    return false;
                else {
                    ch2 = GetTop(S);
                    if(ch==ch2){
                        Pop(S,ch2);
                    }
                    else
                         return false;
                }
        }
        cin >> ch;
    }
    if(StackEmpty(S))
        return true;
    else
        return false;
}
int main()
{
    LinkStack S;
    cout << "请输入待匹配的表达式,以“#”结束:" << endl;
    int flag = (int)Matching();
    if (flag)
        cout << "括号匹配成功!" << endl;
    else
        cout << "括号匹配失败!" << endl;
    return 0;
}

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

img

如有碰到左括号则入栈,如果碰到右括号则出栈。
最后如果堆栈为null,则匹配。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632