【数据结构_栈_Stack_0962】括号匹配问题


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 200
typedef struct node
{
    char data[maxn];
    int top;
}Stack;
void origin(Stack *&s)
{
    s=(Stack *)malloc(sizeof(Stack));//初始化;
    s->top=-1;//先将栈顶置为-1,后面需要进行++操作;
}
void push(Stack *&s,char str)
{
    if(s->top==maxn) exit(0);
    /*
    exit(1)表示异常退出.这个1是返回给操作系统的;
    exit(x)(x不为0)都表示异常退出;
    exit(0)表示正常退出;
    */
    s->top++;
    s->data[s->top]=str;//入栈;
}
char pop(Stack *&s,char str)
{
    if(s->top==-1) exit(0);//栈中没有元素,正常退出;
    str=s->data[s->top];//删除栈中当前的值;
    s->top--;
    return str;
}
int Left_Mark(char str)
{
    if(str=='(' || str=='[' || str=='{') return 1;
    else return 0;
}
int Right_Mark(char str)
{
    if(str==')' || str==']' || str=='}') return 1;
    else return 0;
}
int judge(char str1,char str2)
{
    if((str1=='(' && str2==')') || (str1=='[' && str2==']') || (str1=='{' && str2=='}'))
        return 1;
    else return 0;
}
int main()
{
    Stack *s;//从栈中实例化一个对象;
    origin(s);//将实例化的对象调用并且初始化;
    char str[1005];//致以我对str深沉的爱;
    while(cin>>str)
    {
        int len=strlen(str);
        for(int i=0;i<len;i++)
        {
            if(Left_Mark(str[i])==1) push(s,str[i]);
            else if(Right_Mark(str[i])==1)
            {
                if(s->top==-1)//栈为空,无法与之匹配;
                {
                    cout<<"NO";
                    exit(0);
                }
                char e;
                e=pop(s,e);
                if(judge(e,str[i])==0)//将之前栈里的最后一个元素出列,和新入的右括号比对
                {
                    cout<<"NO";
                    exit(0);
                }
            }
        }
        if(s->top!=-1) cout<<"NO";//栈中有元素没有用完;
        else cout<<"YES";
    }
    return  0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值