| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2532 人关注过本帖
标题:用stack进行括号匹配,求指点哪里出错了。
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:16 
用stack进行括号匹配,求指点哪里出错了。
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;

int main()
{
    int N;
    stack <char> s;
    char a[1000];
    s.push('@');
    cin>>N;
    getchar();
    while(N--)
    {
        gets(a);
        int len=strlen(a);
        if(len%2!=0)
            cout<<"No"<<endl;
        else
        {
            for(int i=0;i<len;i++)
                if(a[i]=='['||a[i]=='(')
                    s.push(a[i]);
                else if((a[i]=='['&&s.top()==']')||(a[i]=='('&&s.top()==')'))
                    s.pop();
                else
                    s.push(a[i]);
            
            if(s.top()=='@')        
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
               
        
        }
    }
    return 0;
}


图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: stack int push cout top 
2017-12-18 23:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
图例这个结果没问题啊,怎么会出错呢~不是括号数目相等就一定输出"NO"的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-12-19 01:52
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 九转星河
不应该是Yes吗、
2017-12-19 11:18
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 九转星河
提交程序时总出现是RunTimeError是怎么回事呀
2017-12-19 11:21
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
话说,这个可以优化的,判断不成立直接可以输出NO而不用判断完毕才输出~

微优化的话试试不要strlen函数直接用'\0'作为结束标志?
毕竟strlen实现方法也是不能避免遍历的,不过好像C++的话用string型可以用.size方法获取长度不知道会不会快些?~



[此贴子已经被作者于2017-12-19 12:36编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-12-19 12:30
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 5楼 九转星河
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;

int main()
{
    int N;
    stack <char> s;
    char a[1000];
    s.push('@');
    cin>>N;
    getchar();
    while(N--)
    {
        gets(a);
        int len=strlen(a);
        if(len%2!=0)
        {
            cout<<"No"<<endl;
            break;
        }

        else
        {
            for(int i=0;a[i]!='\0';i++)
                if(a[i]=='['||a[i]=='(')
                    s.push(a[i]);
                else if((a[i]=='['&&s.top()==']')||(a[i]=='('&&s.top()==')'))
                    s.pop();
                else
                    s.push(a[i]);
            
            if(s.top()=='@')        
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
               
        
        }
    }
    return 0;
}

改成这样提交时又出现编译时出错。。
2017-12-19 13:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
简单写个实现方法可以参考一下,没有经过编译或许存在bug~

程序代码:
#include<limits.h>

bool fun(char* p)
{
    stack <int> s;

    int k[ 1<<CHAR_BIT-1];

    k['@']=0;

    k['(']=1;
    k[')']=-k[')'];

    k['[']=2;
    k[']']=-k['['];

    for (s.push(k['@']);*p;++p)
        if (k[*p]>0)
            s.push(k[*p]);
        else if (k[*p]==-s.top())
            s.pop();
        else
           return false;
    
    return true;
}







[此贴子已经被作者于2017-12-19 13:24编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-12-19 13:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 花脸
else if((a[i]=='['&&s.top()==']')||(a[i]=='('&&s.top()==')')

else if((a[i]==']'&&s.top()=='[')||(a[i]==')'&&s.top()=='(')

还是不说其它了,这两句好好比对一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-12-19 13:37
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:10 
字符串从左到右依次扫描,遇到左括号进栈,遇到右括号出栈。扫描完毕后,如果栈为空则括号匹配正确,否则括号不匹配。
2017-12-19 14:35
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 7楼 九转星河
int k[ 1<<CHAR_BIT-1];

这是什么意思呢?
2017-12-19 19:49
快速回复:用stack进行括号匹配,求指点哪里出错了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017339 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved