题目1153:括号匹配问题(栈的使用)

题目链接:http://ac.jobdu.com/problem.php?pid=1153

详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus

2017年07月27日22:25:45 郑鹏飞

这里的括号匹配问题类似之前的常规问题。但是要求输出不匹配的括号的标记,同时结果不仅输出不匹配位置还要输出原来的字符串!

因此为了标记不匹配的括号,同时为了区分左括号与右括号不匹配时的输出结果不相同,需要分别对其进行判断。

因此需要判断每一个左括号是否有对应的右括号。

如果左括号有相应匹配的右括号。那么就标记这两个位置的括号都是匹配的,可以设置为1。默认当前位置的括号都是不匹配的也就是0.

此外,其他部分均与常规括号匹配一致,使用栈进行操作。

左括号入栈(这里入栈的是左括号所在输入字符串的下标)

遇到右括号,看栈是否为空,如果不为空,那么栈顶出栈。并且设置出站的下标对应的左括号是匹配的,设置相应的右括号的下标也是匹配的。

因此需要栈保存下标

需要数组保存对应下标括号是否匹配。

最终输出时,进行遍历。当前位置为左括号并且不匹配则输出$,匹配则输出" " 即一个空格

当前位置为右括号并且不匹配则输出?,匹配则输出" " 即一个空格

遇到其他的不是括号的字符,全部输出" " 即一个空格。

至此完成代码。 

//
//  1153 括号匹配问题.cpp
//  Jobdu
//
//  Created by PengFei_Zheng on 08/04/2017.
//  Copyright © 2017 PengFei_Zheng. All rights reserved.
//
 
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stack>
 
using namespace std;
 
stack<int> l;
char s[110];
 
int main(){
    while(scanf("%s",s)!=EOF){
         
        int len = (int)strlen(s);
        int flag[len];
        memset(flag,0,sizeof(flag));
        while(!l.empty())
            l.pop();
        for(int i = 0 ; i < len ; i++){
            if(s[i]=='(')
                l.push(i);
            else if(s[i]==')' && !l.empty()){
                int temp = l.top();
                l.pop();
                flag[i]=1;
                flag[temp]=1;
            }
        }
        printf("%s
",s);
        for(int i = 0 ; i < len ; i++){
            if(s[i]=='('){
                if(flag[i]!=1)
                    printf("$");
                else
                    printf(" ");
            }
            else if(s[i]==')'){
                if(flag[i]!=1)
                    printf("?");
                else
                    printf(" ");
            }
            else{
                printf(" ");
            }
        }
        printf("
");
    }
    return 0;
}
 
/**************************************************************
    Problem: 1153
    User: zpfbuaa
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1524 kb
****************************************************************/
原文地址:https://www.cnblogs.com/zpfbuaa/p/6683106.html