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

来源:互联网 发布:php sql注入 编辑:程序博客网 时间:2024/06/04 18:08
//全局的字符串不初始化默认为每一个元素都是'\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;}