动态数组
其实就是普通数组升级版,升级功能是长度可以变化
基本操作
引入头文件:#include<vector>
推荐好文:C++ vector的常见用法详解(超详细)\(^o^)/~_vector c++ 用法-CSDN博客
在这里只需要学会
name.push_back()
name.resize()
实例:
#include<iostream>
#include<vector>
using namespace std;
vector <int> s;
int main(){
cout<<"初始的动态数组 s 长度为 "<<s.size()<<endl;
s.resize(2);
cout<<"扩充后的动态数组 s 长度为 "<<s.size()<<endl;
s[0] = 1;
*(s.begin()+1) = 2;
s.push_back(3);
for(int i=0;i<3;i++) cout<<"第 "<<i+1<<" 个元素的值是 "<<s[i]<<endl;
return 0;
}
分析题意+代码实现
直接二维动态数组,不够扩充即可
AC CODE:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n,q;
cin>>n>>q;
vector< vector<int> > s(n+1);//多少个柜子给多少 0~n-1 为标号,所以开到 n+1
while(q--){
int x,i,j,k;
cin>>x;cin>>i>>j;
if(x==1){
cin>>k;
if(s[i].size()<j+1){
//不够空间 扩充
s[i].resize(j+1);
}
s[i][j] = k;
}else{
cout<<s[i][j]<<endl;//类似正常数组
}
}
return 0;
}
栈
先进后出,后进先出
进栈1
进栈2
进栈3
出栈顺序: 3 2 1
经典例题:后缀表达式 - 洛谷
基本操作
引入头文件
#include<vector>
推荐文章:C++中stack的用法(超详细,入门必看)_c++ stack-CSDN博客
这里只需要学会
empty() //判断堆栈是否为空
pop() //弹出堆栈顶部的元素
push() //向堆栈顶部添加元素
size() //返回堆栈中元素的个数
top() //返回堆栈顶部的元素
分析题意+代码实现
中缀表达式是我们日常使用的 例如 (2+6)* 3 + 7
后缀表达式 该式子该如何表现呢?
从左边到右边,再到运算符的表示方法
该表达式为 2 6 + 3 * 7 +
刚好可以模拟栈的操作
最后出栈,压24+7 = 31,栈顶为answer
AC CODE:
#include<iostream>
#include<stack>
using namespace std;
stack <int> s;
int num;
int main(){
char a;
while(cin>>a&&a!='@'){
if(a=='*'||a=='-'||a=='+'||a=='/'){
int r = s.top();
s.pop();
int l = s.top();
s.pop();
if(a=='*') s.push(l*r);
else if(a=='-') s.push(l-r);
else if(a=='+') s.push(l+r);
else if(a=='/') s.push(l/r);
}else{
if(a=='.') {
s.push(num);num=0;
}else{
num = num*10 + (a-'0');
}
}
}
cout<<s.top();
return 0;
}