一、模拟链表
单链表
模拟单链表
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int head,ne[N],e[N],idx;
int n;
void init()
{
head = -1;
idx=0;
}
void add_to_head(int x){
e[idx] = x;
ne[idx]= head;
head=idx;
idx++;
}
void add(int k,int x){
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
void remove(int k)
{
ne[k]=ne[ne[k]];
}
int main()
{
scanf("%d",&n);
init();
while(n--)
{
int k ,x;
char c;
cin>>c;
if(c=='H'){
scanf("%d",&x);
add_to_head(x);
}
else if(c=='D'){
scanf("%d",&k);
if(k==0) head=ne[head];
else remove(k-1);
}
else if(c == 'I'){
scanf("%d%d",&k,&x);
add(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";
return 0;
}
双向链表
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int l[N],r[N],e[N],idx;
int n;
void init()
{
r[0]=1,l[1]=0;
idx=2;
}
void add(int k,int x){
e[idx] = x;
r[idx]= r[k];
l[idx] = k;
l[r[k]] = idx;
r[k]=idx;
idx++;
}
void remove(int k)
{
r[l[k]]=r[k] ;
l[r[k]]=l[k];
}
int main()
{
cin>>n;
init();
while(n--)
{
string c;
cin>>c;
int k,x;
if(c=="L"){
cin>>x;
add(0,x);
}
else if(c=="R"){
cin>>x;
add(l[1],x);
}
else if(c=="D"){
cin>>k;
remove(k+1);
}
else if(c=="IL"){
cin>>k>>x;
add(l[k+1],x);
}
else if(c=="IR"){
cin>>k>>x;
add(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i])
cout<<e[i]<<" ";
return 0;
}
二、栈与队列
模拟栈、队列的基本操作
#inclcude<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int stk[N], tt = 0;
stk[ ++ tt] = x;
tt -- ;
stk[tt];
if (tt > 0)
{
}
-------------------------------------------
#include<bits/stdc++.h>
using namespace std;
int q[N], hh = 0, tt = -1;
q[ ++ tt] = x;
hh ++ ;
q[hh];
if (hh <= tt)
{
not empty;
}else
empty;
三、KMP
Acwing
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m;
char p[N],s[N];
int ne[N];
int main()
{
cin>>n>>p+1>>m>>s+1;
for(int i=2,j=0;i<=n;i++)
{
while(j&&p[i]!=p[j+1]) j=ne[j];
if(p[i]==p[j+1]) j++;
ne[i]=j;
}
for(int i=1,j=0;i<=m;i++)
{
while(j&&s[i]!=p[j+1]) j=ne[j];
if(s[i]==p[j+1]) j++;
if(j==n)
{
printf("%d ",i-n);
j=ne[j];
}
}
return 0;
}