寒假一期:数据结构(1):STL(1)

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 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值