双链表问题
初始化
简单的把1当成tail,0当成head
void init(){
l[1]=0,r[0]=1;
idx=2;
}
在第k个点右边插入一个x
void add(int k,int x){
//1.先在e[]里面添加x
e[idx]=x;
//2.创建结点
l[idx]=k;
r[idx]=r[k];
//3.添加边
l[r[k]]=idx;
r[k]=idx;
//4.
idx++;
}
//左边的话
// void add(int l[k],int x)
删除k个点
void remove(int k){
r[l[k]]=r[k];
l[r[k]]=l[k];
}
当然在实际main函数里,记得k+1;
栈与队列
模拟栈、队列
栈 先进后出
#include<iostream>
using namespace std;
const int N=100010;
int st[N];
int top=-1;
int n;
int main(){
cin>>n;
while(n--){
string s;
cin>>s;
if(s=="push"){
int a;
cin>>a;
st[++top]=a;
}
if(s=="pop"){
top--;
}
if(s=="query"){
cout<<st[top]<<endl;
}
if(s=="empty"){
cout<<(top==-1?"YES":"NO")<<endl;
}
}
return 0;
}
队列 先进先出
//head=0,tail=-1
void push(int x){
//此处必须队尾先往后移动一格
q[++tail]=x;
}
void pop(){
head++;
}
void empty(){
if(tail>=head) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
void query(){
cout<<q[head]<<endl;
}
单调栈
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
vector<int> getBiggerInt(vector<int> t){
stack<int> temp;
vector<int> ans(t.size(),-1);
for(int i=0;i<t.size();i++){
if(i==0) {
ans.push_back(-1);
temp.push(t[0]);
}
else{
if(t[i]>temp.top()){
ans[i]=temp.top();
}
else{
ans[i]=-1;
temp.push(t[i]);
}
} //超时了。。。
}
return ans;
}
// int main(){
// int m;
// scanf("%d",&m);
// vector<int> t(m);
// for(int i=0;i<m;i++){
// scanf("%d",&t[i]);
// }
// vector<int> ans=getBiggerInt(t);
// for(int i=0;i<m;i++){
// printf("%d ", ans[i]);
// }
// return 0;
// }
int main(){
int m;
cin>>m;
int top=0;
vector<int> ans(m,-1);
while(m--){
int x;
scanf("%d",&x);
while(top && ans[top]>=x) top--;
if(!top) printf("-1 ");
else printf("%d ",ans[top]);
ans[++top]=x;
}
return 0;
}