zoukankan      html  css  js  c++  java
  • 第四章学习小结

    第四章学习的主要内容为:

    串、数组和广义表

    一、首先是串的模式匹配

    使用BF算法,先写函数声明和主函数:

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int Index_BF(string, string, int);
    
    int main()
    {
    	string s,t;
    	cin>>s;
    	cin>>t;
        if(Index_BF(s, t, 1)==-1)cout<<0;
    	else cout<<Index_BF(s, t, 1);
     } 
    

    先输入主串和子串,在根据BF算法的返回值进行输出;

    BF算法的函数:

    int Index_BF(string s, string t, int pos)
    {
    	int i,j;
       	i = pos-1;
    	j = 0;
       	while(i<s.length() && j<t.length())
    	   { 
          	if(s[i]==t[j]){++i; ++j;}
          	else{i=i-j+1; j=0;}
    	   }
            if(j==t.length()) 
            return i-t.length()+1;
            else return -1;    
    }
    

    要注意pos所代表的含义,上述代码中pos为在主串中的位置,因此用于计数的i为pos-1,而后面返回的位置则为i-t.length()+1,根据样例,若不进行修改,则返回值为5,而不为六。

    二、用三元组表储存稀疏矩阵:

    先定义储存非零元素行列值信息的node结构体,在使用一个结构体来包含稀疏矩阵的信息:

    #include<iostream>
    #define maxsize 100
    using namespace std;
    
    typedef struct
    {
    	int r;
    	int c;
    	int v;
    }node; 
    struct sparse
    {
    	int m;
    	int n;
    	int N;
    	node data[maxsize];
    };
    

    因为稀疏矩阵中非零元素很少,题目给出N<=500,因此我认为可以将maxsize定义为100;

    存放一个稀疏矩阵:

    	int k;
    	sparse S;
    	cin>>S.m>>S.n>>S.N;
    
    	
    	for(int i=0;i<S.N;i++)
    	{
    		cin>>S.data[i].c>>S.data[i].r>>S.data[i].v;
    	}
    

    先输入稀疏矩阵的行数、列数和矩阵中非零元素的个数;

    然后输入稀疏矩阵的非零元素所在的行、列号和非零元素的值:

    查询的非0数据k:

    	cin>>k;
    
    	for(int i=0;i<S.N;i++)
    	{
    		if(k==S.data[i].v)
    		{
    		cout<<S.data[i].c<<" "<<S.data[i].r;
    		break;
    	    }
    	    if(k!=S.data[S.N-1].v)
    	    cout<<"ERROR";
    	}
    

    这里在测试的时候不太顺利,首先当k存在时要输出行列位置,并且跳出循环,第二个条件是k不存在时要输出ERROR,一开始写的是

    if(k!=S.data[S.N].v)

    cout<<"ERROR";
    结果输出一个地址,第二个if语句执行的条件是满足k不存在且要执行的到最后一个非零元素,因此应该是k!=S.data[S.N-1].v
    三、是AI核心代码
    老师在课堂上给我们讲的思路已经十分清晰了;
    主要是自己在写的时候细节的处理:
    如我判断标点的函数写的就比较直接
    bool isPunctuation(char ch)
    {
    	ch = tolower(ch);
    	if(ch>='0' && ch<='9' || ch>='a' && ch<='z' || ch=='I'||ch==' '||ch=='')
            return false;
        else 
            return true;    
    }
    还有就是输出的最后一个字母后面仍然带有空格
    测试一下
        char a[3];
        a[0]='';
        cout<<a[0]<<"***"<<endl;
    
    输出的结果为 ***
    在最后输出时加上
            if(t[j]==' '&&t[j+1]=='') break;
                 cout << t[j++];
    

     可以解决问题

    四、总结,其实实现的思路都不算难,但是还是要基本功扎实才好把思路都呈现出来,还有一些细节的地方都要做好,写出来的代码才符合预期。

    五、慢慢地觉得打代码是一件有挑战有乐趣的事,还是要抓紧时间多读多看代码,学以致用,多打些题,才能有所成长。

    
    
  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/gwpsf/p/10704391.html
Copyright © 2011-2022 走看看