vector
vector 是 STL 库里的一种数据结构。
跟数组类似。
当然也可以用来定义变量,只是定义的方式有些许不同。
vector<type> var name;
比如,你可以
vector<int> vi;
vector<double> vd;
vector<string> vs;
vector< int* > v_i;
vector< int(*)(/*函数形参类型*/) > p;
vector< vector<int> > vvi;
尖括号里可以是任何一种数据结构,包括指针,函数指针,甚至 vector 自己。
用数组装函数看着就酷好吗
vector 与数组不同的一点就是可以扩容。
在一般的 c++ 编译器里,我们可以用 push_back 函数在 vector 后面添加一个对应的数据类型,当 vector 空间不足时,便会扩容。每次占用的空间提升到原来的两倍。
那么 vector 占用的空间太大了怎么办?
可以这样
vector<int> vi;
vi.clear();//清空vector
vi.resize(x,y)//将vector的大小重置至10,多则删,少则填补,填补的值为y(y可以不要)
vector常用函数大全
vector<int> vi;
vi.push_back(k)//在 vector 后面添加一个int类型的k
vi.pop_back()//在 vector 后面删除一个int类型的k
vi.clear();//清空vector
vi.resize(x,y)//将vector的大小重置至10,多则删,少则填补,填补的值为y(y可以不要)
int y=vi.front();//把v[0]赋值给y
int y=vi.back();//把最后一个元素赋值给y
vi.empty()//判空
习题1.寄包柜
寄包柜——题目
使用 vector 的 resize 控制大小,自然不会MLE
AC code
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<vector<int>/*中间一定要有空格不然会报错的!!!*/ >vvi(n+1);
for(int i=1;i<=m;i++){
int a;
cin>>a;
if(a==1){
int b,c,d;
cin>>b>>c>>d;
if(vvi[b].size<=c){
vvi[b].resize(c+1);
}
vvi[i][j]=d;
}else{
int i,j;
cout<<vvi[i][j]<<endl;//像访问数组一样访问vector就行了
}
}
}
Stack
stack(栈)同样也是 STL 库里的一个数据结构。
其满足一个性质,就是后进先出(Last In First Out,LIFO)。
具体原理:
总之就是普通的进去,出来,上面的元素压住下面的。
这个过程我们也有专门的函数来实现。
stack常用函数大全
push(type k);//入栈
pop();//出栈
top();//访问栈顶元素
size();//查询栈的元素个数
empty();//查询栈空否
整个过程,我们可以使用数组进行模拟。
比如这样:
int stack[10005],cnt=0;
void push(int k){
cnt++;
stack[cnt]=k;
}
void pop(){
stack[cnt]=0;
cnt--;
}
int top(){
return stack[cnt];
}
int size(){
return cnt;
}
bool empty(){
return cnt==0;
}
我们也可以使用 STL 库中的 stack 来实现。
#include<bits/stdc++.h>
using namespace std;
int main(){
stack<int> st;
st.push(114514);
cout<<st.top()<<" "<<st.size()<<endl;
st.pop();
if(st.empty()) cout<<"empty";
}
千万不要在栈空的时候出栈,否则直接 RE 。
例题
把问题分成两块:
- 是否可行
- 中转站容量
首先我们看到是否可行这一部分。
有一个显而易见的事情。
就是当一个车厢需要进行入栈并出栈,那么其前面的车厢必须全部入栈。
必须前面没有车厢拦住,这样这个车厢才可以入栈。
如果目前要出栈的车厢比入栈最大的车厢都还大,那么就入栈直到要出栈的车厢。
如果目前要出栈的车厢刚好是栈顶端的车厢,那么出栈。
如果目前要出栈的车厢比栈顶端的车厢小,说明这个车厢被压在栈的下面,不能出栈,所以方案不可行。
这样,在模拟的过程中记录车厢的最大容量,最后输出即可;
AC code
#include<bits/stdc++.h>
using namespace std;
stack<int> si;
int n,k,ms,j=0;//因为车厢顺序进入,所以用j记录最大车厢。
int main(){
cin>>n;
si.push(-1);
for(int i=1;i<=n;i++){
cin>>k;
if(k>j){//大于就放
for(j+=1;j<=k;j++){
si.push(j);
}
ms=max(ms,(int)si.size()-1);
si.pop();
j--;
}else if(k==si.top()){//等于就删
si.pop();
}else if(k<si.top()){//小于就判错
cout<<"no";
return 0;
}
}
cout<<"yes"<<endl<<ms;
}
例题plus
车站铁轨的升级版,多组数据,顺序打乱,可以做一下。
思路是一模一样的(双倍经验)
验证栈序列
queue
queue (队列)跟栈类似,但是刚好与栈相反,队列是先进先出( First In First Out , FIFO )的数据结构。
具体就像下图:
queue常用函数大全
push(type k);//入队
pop();//出队
front();//取队首
size();//查询队列长度
empty();//判空
队列跟栈的使用方法差不多。
但是,还有一句话:
千万不要在队空的时候出队,否则直接 RE 。