标题:请问C语言写栈的问题怎么解决呀
只看楼主
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
结帖率:96.88%
已结贴  问题点数:20 回复次数:10 
请问C语言写栈的问题怎么解决呀
(程序代码中的括号匹配)请编写程序对一段程序代码中的括号匹配情况进行判断。括号类型有(),[],{}三类,程序代码中可能包含注释,如多行注释/**/和单行注释//,且注释内容不参与括号匹配情况的分析。
【输入】 若干行程序代码,代码长度小于1500个字符
【输出】 除去注释后的括号数量 括号是否匹配(yes/no)
例如:
【输入】
int Collatz(unsigned int n) {
    if(n==1) return 0;
    else if(n%2) return Collatz(n*3+1)+1;
    else return Collatz(n/2)+1;
}
【输出】12 yes

【输入】
float CalcPay( /* [in] */  float  payRate,     // Employee's pay rate
              /* [in] */  float  hours      // Hours worked
               ){     //return Wages earned()
【输出】 3 no

【输入】"//" ()
【输出】2 yes
搜索更多相关主题的帖子: 括号 代码 输入 输出 注释 
2020-03-17 17:38
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
//orz虽然很想自己解决但是我还不熟悉栈的规则,老师只讲了C艹的自定义栈,但是我也就能看懂一大半更别说自己写了
//好像思路就是见到左括号压栈,见到右括号出栈,并将弹出的左括号和右括号配对。

我想要两颗西柚。
2020-03-17 17:40
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
得分:0 
你得到一个括号就把他存入栈,如果得到对应的括号,就把栈顶的弹出,最后输入完后,如果栈为空,就代表匹配

2020-03-17 19:37
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 3楼 return_0
我看了一下老师的ppt有个相关的题,请问访问栈顶是什么意思...访问完以后又push是什么操作啊...

我想要两颗西柚。
2020-03-17 21:38
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
程序代码:
#include <iostream>
#include<stdio.h>
using namespace std;
typedef char AAA;
const int maxstack=10;
enum Error_code{underflow,overflow,success};
class Stack
{
    public:
   Stack(){count=0;};
   bool empty() const;
   Error_code push(const char &item);
   Error_code pop();
   Error_code top(char &item) const;

    private:
        int count;
        AAA entry[maxstack];

};
Error_code Stack::push(const AAA &item)
{
    Error_code outcome=success;
    if(count>=maxstack)
        outcome=overflow;
    else
        entry[count++]=item;
    return outcome;
}
Error_code Stack::pop()
{
    Error_code outcome=success;
    if(count==0)
        outcome=underflow;
    else --count;
    return outcome;
}
bool Stack::empty() const
                     {
   bool outcome = true;
   if (count > 0) outcome = false;
   return outcome;
}

Error_code Stack::top(AAA &item) const
{
    Error_code outcome=success;
    if(count==0)
        outcome=underflow;
    else
        item=entry[count-1];
    return outcome;
}
int main()
{   Stack openings;
    char symbol;
    int n=0;
    int error=0;
    while((symbol=cin.get())!=EOF)
    {    if(symbol=='/')
        {  symbol=cin.get();
            if(symbol=='/')
            {
                 do(symbol=cin.get());
                    while(symbol=='\n');
            }
            else if(symbol=='*')
            {   symbol=cin.get();
                int k=0;
                while(!k)
                { while(symbol!='*')
                    symbol=cin.get();
                    if(symbol=='/')
                    k=1;
                }
            }
        }
       else if(symbol=='{'||symbol=='('||symbol=='[')
        {
            n++;
            openings.push(symbol);
        }
        else if(symbol=='}'||symbol==')'||symbol==']')
        {
            n++;
            if(openings.empty())
            error++;
             else
            {
                char match;
                openings.top(match);
                openings.pop();
                if((symbol == '}' && match != '{')|| (symbol == ')' && match != '(')|| (symbol == ']' && match != '['))
                error++;

            }
        }
       


    }
    if(!openings.empty())
        error++;
    cout<<n;
    if(error==0) cout << " yes" << endl;
    else cout << " no" << endl;

    return 0;
}
抄抄改改变成这样了 5个点过了3个orzC语言的栈怎么写啊到底

我想要两颗西柚。
2020-03-17 23:57
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
得分:0 
。。。

2020-03-18 08:50
return_0
Rank: 8Rank: 8
来 自:五维空间
等 级:禁止访问
威 望:3
帖 子:512
专家分:838
注 册:2020-1-28
得分:2 

2020-03-18 08:50
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:16 
程序代码:
#include <iostream>
#include<stdio.h>
using namespace std;
const int maxstack=10;
enum Error_code {underflow,overflow,success,error};
class Stack
{
public:
    Stack()
    {
        counts=0;
    };

    Error_code push(const char &item);
    Error_code pop(const char &item);
    int counts;

private:
    char entry[maxstack];

};
Error_code Stack::push(const char &item)
{
    Error_code outcome=success;
    if(counts>=maxstack)
        outcome=overflow;
    else
        entry[counts++]=item;
    return outcome;
}
Error_code Stack::pop(const char &item)
{
    Error_code outcome=success;
    if(counts==0)
        outcome=underflow;
    else if(entry[--counts]!=item)
        outcome=error;
    return outcome;
}

int main()
{
    Stack openings;
    char symbol;
    int n=0,flag=success;
    while((symbol=cin.get())!=EOF)
    {
        if(symbol=='"')
        {
            while(1)
            {
                if((symbol=cin.get())=='"')
                    break;
            }
        }
        else if(symbol=='/')
        {
            symbol=cin.get();
            if(symbol=='/')
            {
                do
                {
                    symbol=cin.get();
                }
                while(symbol!='\n');
            }
            else if(symbol=='*')
            {
                while(1)
                {
                    if((symbol=cin.get())=='*')
                        if((symbol=cin.get())=='/')
                            break;
                }
            }
        }
        else if(symbol=='{'||symbol=='('||symbol=='[')
        {
            n++;
            openings.push(symbol);
        }
        else if(symbol=='}'||symbol==')'||symbol==']')
        {
            n++;
            if(flag==success)
            {
                char match;
                switch(symbol)
                {
                case '}':
                    match='{';
                    break;
                case ')':
                    match='(';
                    break;
                case ']':
                    match='[';
                    break;
                }
                flag=openings.pop(match);
            }
        }
    }
    cout<<n;
    if(flag==success&&openings.counts==0)
        cout << " yes" << endl;
    else
        cout << " no" << endl;

    return 0;
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-18 10:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:2 
去除 注释 简单,但要不要考虑 单行注释后面接了个续行符?比如
// 我是单行注释,且尾部有 续行符 哦 \
这里上接单行注释 \
这里还是上接单行注释

括号匹配 简单,但要不要考虑字符串字面量?比如
"这里面的任何括号 {{{((([[[ \"\"\" 都应当被忽略"
如果考虑字符串字面量,那代码中双引号不匹配怎么办?
程序代码:
int main()
{
   const char* s = "{{{; // 少一个双引号
}
如果是分析C++代码,C++还有 Raw string literal,头大!
2020-03-18 10:38
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 8楼 纯蓝之刃
代码思路太清楚了!放在平台上第一个点过不了,问同学是因为没考虑“”里的括号可能
改了以后就全部AC了,非常感谢!!

我想要两颗西柚。
2020-03-18 14:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500372-1-1.html




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

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