栈一:括号匹配

题目描述

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    char str[105];
    char ans[105];
    
    stack<char> s;
    
    while(scanf("%s",str)!=EOF)
    {
        int i;
        for(i=0;str[i]!=0;i++)
        {
            if(str[i]=='(')
            {
                s.push(i);
                ans[i]=' ';
                //这个空格占位很重要 要不结果不对 字符没对齐 
            }
            else if(str[i]==')')
            {
                //这里有一个问题,判断栈中有没有左括号 不能直接s.top(),
                //                    因为若栈中没有元素的时候,直接top()会报错。 
                //使用empty() 这个是安全的 并且栈中只有左括号这一种元素,如果不为空就表明栈顶有左括号 
                if(!s.empty())
                {
                    ans[i]=' ';
                    s.pop();
                }
                else
                {
                    ans[i]='?';
                }
            }
            else
            {//其他字符 
                ans[i]=' ';
            }    
            
        }
        //处理完右括号后,若栈中还留存有左括号 这些左括号都是匹配失败的 
        while(s.size()!=0)
        {
            ans[s.top()]='$';
            s.pop();
        }
            /*
        
        这个题额外需要注意地方!
        ans[i]要赋0代表字符串末尾。
        否则尽管人眼看着一样,但会多输出空白导致结果错误! 
        
        */ 
    
        ans[i]=0;
        
        printf("%s\n",str); 
        printf("%s\n",ans);
        
        
        //puts()是一种输出字符串字符数组的方式,末尾自动换行,但有一个要求就是字符串必须以0结尾。
        //其原理是把字符串末尾的0变成了\n,注意这里的0就是0,而不是带有引号的字符'0',务必记住!
         
//        ans[i]=0;
//        puts(ans);
        
    }
    
    
    
    
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值