数据结构——栈的利用:括号匹配问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JEYMING/article/details/80054573
/*
    括号匹配问题,利用链式栈实现
    2018.04.17
*/

#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;

typedef struct StackNode{
    char data;
    struct StackNode *next;
}StackNode,*LinkStack;

//初始化
Status InitStack(LinkStack &S){
    S=NULL;
    return OK;
}

//入栈
Status Pop(LinkStack &S,char str){
    LinkStack p=new StackNode;
    if(p==NULL)
        return ERROR;
    p->data=str;
    p->next=S;
    S=p;
    return OK;
}

//出栈
Status Push(LinkStack &S,char &str){
    if(S==NULL)
        return ERROR;
    LinkStack p=S;
    str=S->data;
    S=S->next;
    delete p;
    return OK;
}

//判断栈是否为空,真为空,假为非空
Status StackEmpty(LinkStack S){
    if(S==NULL)
        return OK;
    return ERROR;
}

//判断是否匹配
Status Match(char str1,char str2){
    switch(str1){
    case '[':
        if(str2==']')
            return OK;
        else
            return ERROR;
        break;
    case '(':
        if(str2==')')
            return OK;
        else
            return ERROR;
        break;
    case '{':
        if(str2=='}')
            return OK;
        else
            return ERROR;
    default:
        cout<<str1<<" "<<str2<<endl;
        cout<<"ERROR Input!"<<endl;
        exit(0);
    }
}

int main(){
    LinkStack S=new StackNode;
    char str[50];
    char tmp;
    cout<<"Please input str:";
    gets(str);
    int len=strlen(str);
    for(int i=0;i<len;++i){
        switch (str[i]){
        case '(':
        case '[':
        case '{':
            Pop(S,str[i]);
            break;
        case ')':
        case ']':
        case '}':
            if(StackEmpty(S)==OK){
                cout<<"右括号多余,请检查!"<<endl;
                return 0;
            }
            else{
                Push(S,tmp);
                if(Match(tmp,str[i])==OK)
                    cout<<tmp<<"与"<<str[i]<<"匹配成功!"<<endl;
                else{
                    cout<<"匹配失败!"<<endl;
                    return 0;
                }
            }
            break;
        }
    }
    if(StackEmpty(S)!=OK)
        cout<<"左括号多余,请检查!"<<endl;
    else
        cout<<"匹配成功!"<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/JEYMING/article/details/80054573
今日推荐