7.14 vector 南阳理工测评的数据结构题

来源:互联网 发布:限制p2p网络连接数 编辑:程序博客网 时间:2024/06/16 06:15

vector array;      array.push_back(1);      array.push_back(6);      array.push_back(3);      array.push_back(6);      array.push_back(6);      array.push_back(2); vector::iterator itor;  for(itor=array.begin();itor!=array.end();)  {      if(6==*itor)      {           itor=array.erase(itor);      }      else      {          itor++;      }  } for(itor=array.begin();itor!=array.end();itor++)cout<<(*itor)<
c++ vector的用法:http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html

(向量) 一种数据结构 相当于动态的数组 当我们无法知道自己需要的数组规模多大的时候 用来解决问题可以达到最大节约空间的目的

个人总结:

1.头文件#include <vector>

2.创建vector对象 vector<int>vec (像创建队列栈一样) 等于声明了一个int的数组vec[]大小没有制定 可以动态向里面添加或删除

如果想要声明一个二维数组的话 vector<int*>a 三维的话vector<int**>a

4.具体用法和调用

例如:

vecotr<int*>a;

int b=5;

a.push_back(b);

cout<<a[0];//输出结果为5

push_back:在数组的最后添加一个数据

pop_back:去掉数组最后一个数据

at:得到编号位置的数据

begin:得到数组头的指针

end:得到最后一个单元+1的指针

front:得到数组头的引用

back:得到最后一个单元的引用

max_size:vector最大可以是多少

capacity:当前vector分配的大小

size:当前数据的大小

empty:判断是否为空

swap :与另外的vector交换数据


具体应用:

c.erase(pos):删除pos位置的数据 返回pos+1的位置

c.erase(beg,end):删除beg到end的数据 删除后会往前移动吗//使用时候注意 这里涉及到迭代器 iterator 返回的是end+1的位置

迭代器iterator:是一种检查容器内元素并且遍历元素的数据类型 又称为“游标模式” 提供一种方法访问容器

例如:

vector<int> array;  
    array.push_back(1);  
    array.push_back(6);  
    array.push_back(3);  
    array.push_back(6);  
    array.push_back(6);  
    array.push_back(2); 
vector<int>::iterator itor;  
for(itor=array.begin();itor!=array.end();)  
{  
    if(6==*itor)  
    {   
        itor=array.erase(itor);  //如果是6就让这个指针指向下一个指针
    }  
    else  
    {  
        itor++;  
    }  

for(itor=array.begin();itor!=array.end();itor++)
cout<<(*itor)<<endl;

所以用erase就要用到迭代器去遍历 然后才可以向前移动

利用erase删除区间的问题还有待解决
c.insert(pos,elem):复制elem到pos的位置上


可以尝试用vector数组来解决约瑟夫环的问题
//用vector数组来解决约瑟夫环 poj 3750
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int N;
cin>>N;
vector<int>c;
int i;
for(i=0;i<N;i++)
c.push_back(i);
char name[64][20];
for(i=0;i<N;i++)
{
cin>>name[i];
}
int W,S;
char a;
cin>>W>>a>>S;
int k=1;
vector<int>::iterator ite;
for(ite=c.begin()+W;ite!=c.end();)
{
k++;
if(k==S)
{
k=0;cout<<name[*(ite)]<<endl;
ite=c.erase(ite);
        }
else ite++;
if(ite>=c.end())
ite=c.begin();
}
system("pause");
return 0;
}
上面这里没有直接vector<char>而是vector<int>来删除已经输出的下标
遍历有下标法和迭代器法


讨论一下用vector<char> string char*的性能差别


总结一下STL:标准模板库,重要特点是数据结构和算法的分离,六大组件:容器 迭代器 算法 仿函数 迭代适配器 空间制配器 


括号配对问题


错误解法:

#include <iostream>
#include <stack>
using namespace std;
int main()
{
int N;
char a;
bool flag;
cin>>N;
stack<char>fuhao;
    while(N--)
{
flag=true;
do
{
cin>>a;
                if(a=='('||a=='[')
fuhao.push(a);
else if(a==')')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='(')
   {flag=false;break;}
else fuhao.pop();
}
  else if(a==']')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='[')
   {flag=false;break;}
else fuhao.pop();
}

}while(a!='\n');
if(flag==true)
cout<<"yes"<<endl;
else cout<<"no"<<endl;
while(fuhao.size()>0)
fuhao.pop();
}
system("pause");
return 0;
}


这里错在 因为我是一行的输入进去 都在缓冲区  当我识别到一个错误的时候 break出来 虽然我把栈里面的东西都pop掉 但是我缓冲区还有东西 

所以下一次就没有让我输入 直接用上一次缓冲区还有的符号 

还有一个问题是 识别不了最后的换行符号 即a!=0这里

解决方法 1清空缓冲区

                  #include <iostream>
#include <stack>
using namespace std;
int main()
{
int N;
char a;
bool flag;
cin>>N;
stack<char>fuhao;
    while(N--)
{
flag=true;
   cin.sync();
cin>>a;
while(a!='\n')
{

                if(a=='('||a=='[')
fuhao.push(a);
else if(a==')')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='(')
   {flag=false;break;}
else fuhao.pop();
}
  else if(a==']')
{
if(fuhao.empty())
{flag=false;break;}
else if(fuhao.top()!='[')
   {flag=false;break;}
else fuhao.pop();
}
cin.get(a);
}
if(flag==true)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
while(fuhao.size()>0)
fuhao.pop();
}
system("pause");
return 0;
}


问题都解决了 数据都过了  但是还没能ac???

有可能错在数据的长度问题 网上搜索的答案是用数组来做的

尝试一下

#include <iostream>
#include <string.h>
#include <stack>
using namespace std;
int main()
{
   int N;int str;
   stack<char>fuhao;
   char f[10000];
   cin>>N;
   int i;
   bool flag;
   while(N--)
   {
  flag=true;
  cin>>f;
  str=strlen(f);
  if(str%2==1) flag=false;
  else
  {
  for(i=0;i<str;i++)
  {if(f[i]=='('||f[i]=='[')
        fuhao.push(f[i]);
  else if(f[i]==')')
       {if(fuhao.empty())
  {flag=false;break;}
  else if(fuhao.top()!='(')
  {flag=false;break;}
  else fuhao.pop();
       }
  else if(f[i]==']')
      {if(fuhao.empty())
  {flag=false;break;}
  else if(fuhao.top()!='[')
  {flag=false;break;}
  else fuhao.pop();
      }
  }
while(fuhao.size()>0)
fuhao.pop();


  }
  if(flag==true)
  cout<<"Yes"<<endl;
  else cout<<"No"<<endl;
   }
   return 0;
}

这个是ac的答案


反思总结:

那种有告诉字符串长度的 一般都放在数组中 然后用strlen里计算长度就可以一个个地用 要包含头文件string.h

然后这里一个小技巧 配对问题一定会是双数 所以一开始判断出单数就可以直接false break









原创粉丝点击