1. 定义数组 const int maxn=
2.定义可变数组vector <char> v; // vector默认长度是0, 类型可以是c++的标准类型,也可以是自己定义的类或结构体
vector <int> v(N); // 效果类似int v[N];但是N可以是变量
vector <int> v(N, i); // 可变数组最开始有N个元素,每个元素的值是i,i可以省略不写
vector < vector<int> > v; // > > 分开写,有的编译器不分开会当成右移符合>>
3.相关函数 1.int len = v.size();该函数会返回一个size_t类型的值,表示vector内元素的个数(数组的长度) 2. v.resize();如果原本内存里不够5个元素,那么调用v[4]就会出现段错误
eg: v.resize(5);给vector重新分配内存,之后v内有5个元素,调用v[4]就不会有问题了
如果原本vector里元素个数已经多于5个了,那么调用resize(5)以后,vector会删除之后多于的元素 3.push_back() 4.遍历for (int i = 0; i < v.size(); ++i) { cout << v[i] << endl;}
4.栈 是只允许在一端进行插入或删除的 线性表。首先栈是一种 线性表,但限定这种线性表只能在某一端进行插入和删除操作。 栈顶线性表允许进行插入删除的那一端。 栈底固定的,不允许进行插入和删除的另一端。 空栈不含任何元素的空表。
建立栈 int sta[1005]; // 用来存储栈内数据的数组
int top; // 栈顶元素的下标
向栈内添加,减少 ++top;sta[top] = x; sta[top] = 0; --top;
5.链表 表中的每个节点在存储本身的相关信息的时候,还可存储一个前驱或者后继
例题一P3613 【深基15.例2】寄包柜
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;//定义数组;
struct guizishu
{
int fangru=0;
vector <int> gezi;
vector <int>wupin;//格子数未知 定义可变数组;
};
guizishu a[maxn];
int main()
{
int n,q;
cin>>n>>q;
int flag,b,c,d;
for(int i=1;i<=q;i++)
{
scanf("%d",&flag);
if(flag==1)
{
scanf("%d%d%d",&b,&c,&d);
a[b].fangru++;//最多查询次数
a[b].gezi.push_back(c);//将数字c添加到gezi[0]之后;
a[b].wupin.push_back(d);//将数字d添加到wupin[0]之后;
}
else
{
scanf("%d%d",&b,&c);
for(int i=a[b].fangru;i>=0;i--)
{
if(a[b].gezi[i]==c)
{
printf("%d\n",a[b].wupin[i]);
break;
}
}
}
}
return 0;
例题二P1241 括号序列
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;//定义数组
int a[maxn];
int main()
{
string s;
cin>>s;
for(int i=0;i<s.length();i++)//题目上咋说就怎么判断
{
if(s[i]==')')
{
for(int j=i-1;j>=0;j--)
{
if(a[j]==0&&(s[j]=='('||s[j]=='['))
{
if(s[j]=='(')
{
a[j]=1;
a[i]=1;
}
break;
}
}
}
if(s[i]==']')
{
for(int j=i-1;j>=0;j--)
{
if(a[j]==0&&(s[j]=='('||s[j]=='['))
{if(s[j]=='[')
{
a[j]=1;
a[i]=1;
}
break;
}
}
}
}
for(int i=0;i<s.length();i++)
{
if(a[i]==0&&s[i]=='(')
{
cout<<"()";
}
if(a[i]==0&&s[i]==')')
{
cout<<"()";
}
if(a[i]==0&&s[i]=='[')
{
cout<<"[]";
}
if(a[i]==0&&s[i]==']')
{
cout<<"[]";
}
if(a[i]==1)cout<<s[i];
}
return 0;
}
例题三P1449 后缀表达式
#include<bits/stdc++.h>
using namespace std;
int top;//栈顶元素的下标
int a[55];//栈
int main()
{
string s;
cin>>s;
int k=-1;//用k来定位最新的数字操作符'.' ,便于存数字 ;
int med;
for(int i=0;i<s.length();i++)
{
if(s[i]=='.')
{
int x=0;
int y=1;
top++;
if(s[k+1]=='-')//考虑负数
{
for(int j=i-1;j>=k+2;j--)
{
x=x+(s[j]-'0')*y;
y=y*10;
}
x=(-1)*x;
}
else
for(int j=i-1;j>=k+1;j--)
{
x=x+(s[j]-'0')*y;
y=y*10;
}
a[top]=x;
k=i;
}
if(s[i]=='+')
{
med=a[top]+a[top-1];
top=top-1;//遇到运算符栈顶元素减一
a[top]=med;
k=i;
}
if(s[i]=='-')
{
med=a[top-1]-a[top];
top=top-1;
a[top]=med;
k=i;
}
if(s[i]=='*')
{
med=a[top-1]*a[top];
top=top-1;
a[top]=med;
k=i;
}
if(s[i]=='/')
{
med=a[top-1]/a[top];
top=top-1;
a[top]=med;
k=i;
}
if(s[i]=='@')
break;
}
cout<<med;
return 0;
}
例题四P1160 队列安排
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m;
struct T{
int l,r;
int flag;
}t[maxn];//定义结构体 为了便于删除 所以使用flag
void add(int i,int k,int p)
{
if(p==1) //将k插入到i的右边
{
t[k].r=t[i].r;//k右边的换为i的右边
t[k].l=i; //k 左边的是i
t[i].r=k;//i右边是k
t[t[k].r].l=k; //k右边的左边是i;
}
else
{
t[k].r=i;
t[k].l=t[i].l;
t[i].l=k;
t[t[k].l].r=k;
}
}
int main()
{
int x,k,p;
cin>>n;
t[0].r=0;
t[0].l=0;
add(0,1,1);
for (int i=2;i<=n;i++)
{
cin>>x>>p;
add(x,i,p);
}
cin>>m;
for(int i=0;i<m;i++)
{ cin>>x;
t[x].flag=1;
}
for (int i=t[0].r;i;i=t[i].r)//当i!=0时一直运行
{
if (t[i].flag==0)
cout<<i<<" ";
}
return 0;
}