我自己的代码没有通过,转载一下“静水流深”的代码:http://www.geekboy.org/huaweioj-five/
#include <iostream>
#include <string>
#include <queue> //queue容器
using namespace std;
struct Element
{
string name;
string line;
int count;
};
string *Output(string s,string result[]) //对于每一条记录输出结果
{
string purename,linenumber;
if (s.find("\\")!=string::npos) //我没有考虑到这句判断
{
int position1=s.find_last_of("\\");
int position2=s.find(" ",position1);
purename=s.substr(position1+1,position2-position1-1);
}
else //输入只有文件名没有路径的情况下
{
int p=s.find_first_of(" ");
purename=s.substr(0,p);
}
if (purename.size()>16)
purename=purename.substr(purename.size()-16,16); //得到净文件名
int positionline=s.find_last_of(" ");
linenumber=s.substr(positionline+1,s.size()-positionline-1);
result[0]=purename;
result[1]=linenumber;
result[2]='1';
return result;
}
int main()
{
string str;
struct Element q[100];
int num=0,k=0;
vector< Element> final;
while (getline(cin,str))
{
string tmp[3];
Output(str,tmp);
q[num].name=tmp[0];
q[num].line=tmp[1];
q[num].count=atoi(tmp[2].c_str());
num++;
}
for (int i=0;i<num;i++)
{
int flag=1;
if (k<8)
{
for (int j=0;j<k;j++)
{
if (q[i].name==final[j].name && q[i].line==final[j].line)
{
final[j].count++;
flag=0;
break;
}
}
if(flag)
{
final.push_back(q[i]);//q[0],k=1,i=1,若相等,final[0].count=2,记录条数k=1
k++;
}
}
else //当第九个元素到达时(k==8)时
{
int flag=1;
for (int j=0;j<k;j++)
{
if (q[i].name==final[j].name && q[i].line==final[j].line)
{
final[j].count++;
flag=0;
break;
}
}
if(flag)
{
final.erase(0+final.begin());//有新的错误记录出现,就删除最早的
final.push_back(q[i]);
}
}
}
for (int i=0;i<final.size();i++)
cout<<final[i].name<<" "<<final[i].line<<" "<<final[i].count<<endl;
}
queue模板:这里头文件中虽然包含的是队列头文件,程序中实际上并没有运用,换成vector也一样
queue 模板类的定义在<queue>头文件中。
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
定义queue 对象的示例代码如下:
queue<int> q1;
queue<double> q2;
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
言归正传,这篇代码中灵活运用了string的各种函数,
s.find_last_of('\\'),直接返回最后一个\所在位置,
s.find(" ",position1),返回从position1开始查找空格在当前字符串中的位置
atoi(s.c_str()),将string转化成整型
代码比我自己的多两部分内容:
1、没有路径的情况 2、出错记录超过8的情况
另外关于记录重复情况:直接在已进栈的元素上修改,重复的不进栈,这样比起我想要在原来的数组里修改,都进栈再将重复的删除,要简洁清晰,而且我的方法是不对的,已进栈的数据,原来的数组变了,栈里的也不会变。这应该就是错误所在!