第十三题 括号匹配问题,使用栈和不使用栈

//全局的字符串不初始化默认为每一个元素都是'\0'其实就是0,(这个0当成int输出就输出一个0,但是当成char输出就输出不出来)
//scanf遇到空格算截止,遇到回车也算,但是gets函数遇到空格不算截止,所以要输入的字符串里面有空格可以使用gets函数

#include <stdio.h>
#include <algorithm>
#include <stack>
#include <string.h>
#include <string>
#include <iostream>

using namespace std;

char str[101];
int tmp[101];
char ans[101];
int cnt;

int main()
{
    while(scanf("%s",&str)!=EOF)
    {
        memset(ans,0,sizeof(ans));//这里注意不能写memset(ans,' ',sizeof(ans));空格和\0的意义是不同的,' '的ascii码为32而\0就是0,初始化为' '之后会输出一大串空格,很可能导致PE!

        cnt=0;

        for(int i=0;i<strlen(str);i++)
        {
            if(str[i]=='(')
            {
                tmp[cnt]=i;
                cnt++;
                ans[i]=' ';
            }
            else if(str[i]==')')
            {
                if(cnt)
                {
                    cnt--;
                    ans[i]=' ';
                }
                else
                {
                    ans[i]='?';
                }
            }
            else
            {
                ans[i]=' ';//这里要注意要设成空格
            }
        }

        while(cnt--)
        {
            ans[tmp[cnt]]='$';
        }

        printf("%s\n",str);
        printf("%s\n",ans);


        //memset(str,0,sizeof(str));//这里必须memset,scanf()一个字符串的时候,发现最好清空之后再scanf,因为scanf不会先将字符串清零之后再输入,而是直接输入多少覆盖多少,然后在最后加了一个\0。
                                  //注意因为只加了一个\0,所以之后的原来的输入没有被\0覆盖
                                  //比如先向str中scanf一个5长度的字符xxxxx\0,再scanf一个2长度的,则变成yy\0xx\0。(后面的全部都是\0,因为是全局的数组)
                                  //终于知道了,不是这里的问题,是上面for里面用了sizeof,所以把str所有的字符都遍历了(遇到\0也不停止)
                                  //所以这里其实不需要memset,只要上面把sizeof变成strlen就好了
    }

////我的实验1:scanf实验,输5个字符的字符串,再输入2个字符的字符串
//    scanf("%s",&str);//s
//    putchar(str[4]);
//
//    scanf("%s",&str);//2
//    putchar(str[4]);//第五个字符还在
//
//    scanf("%s",&str);//5
//    putchar(str[2]);
//
//    scanf("%s",&str);//2
//    putchar(str[2]);//第3个字符被\0覆盖,所以不在了

//我的实验2:sizeof和strlen实验,输5个字符的字符串,再输入2个字符的字符串
//    scanf("%s",&str);//s
//    printf("%d\n",sizeof(str));
//
//    scanf("%s",&str);//2
//    printf("%d\n",sizeof(str));
//
//    scanf("%s",&str);//5
//    printf("%d\n",strlen(str));
//
//    scanf("%s",&str);//2
//    printf("%d\n",strlen(str));


//实验中惊人的发现,c字符串应该用strlen,不应该用sizeof!!!只要我的字符串定义的是101,无论怎么输入,sizeof得到的都是101,但是strlen得到的正确的,因为它是找到第一个\0结束的。
//因为!sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响
//又例如:
//char str[20]="0123456789";
//int   a=strlen(str); //a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。
//int   b=sizeof(str); //b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响

//sizeof就是c语言中的东西!但是string的长度一定用strlen!!

    return 0;
}
//STL的栈,pop()函数没有返回值的
#include <stdio.h>
#include <algorithm>
#include <stack>
#include <string.h>
#include <iostream>

using namespace std;

stack<int> s;

char str[101];
char ans[101];

int main()
{
    while(scanf("%s",&str)!=EOF)
    {
        memset(ans,0,sizeof(ans));//这个是必须的
        for(int i=0;i<strlen(str);i++)
        {
            if(str[i]=='(')
            {
                ans[i]=' ';
                s.push(i);
            }
            else if(str[i]==')')
            {
                if(s.empty())
                {
                    ans[i]='?';
                }
                else
                {
                    ans[i]=' ';
                    s.pop();
                }
            }
            else
            ans[i]=' ';//这一步经常忘记,所以说做题目不能挤着眼做啊,要注意每一步的细节
        }
        while(!s.empty())
        {
            //tmp=s.pop();//STL库 中的pop函数好像是没有返回值的,不能这样用!
            ans[s.top()]='$';
            s.pop();
        }

        printf("%s\n",str);
        printf("%s\n",ans);
    }

//    //STL的容器栈测试
//    s.push(10);
//    s.push(20);
//    s.push(30);
//    cout<<s.top()<<endl;
//    cout<<s.size()<<endl;
//    cout<<s.empty()<<endl;
    return 0;
}
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/lichunchi123/article/details/78650877
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞