1、单链表
//new结点非常慢,所以我们不用结构体模拟指针(动态链表)。用数组。
#include<iostream>
using namespace std;
const int N = 1e5+10;
//idx表示尾结点
int head,e[N],ne[N],idx,M;
//初始化
void init()
{
head = -1;
idx = 0;
}
//头插法
void insert_head(int x)
{
//非物理连续,逻辑连续
e[idx] = x;
ne[idx] = head;
head = idx++;
}
//在第 k 个插入的数后面插入一个数 x
void insert_K(int k,int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
//删除第 k 个插入的数后面的数
void delete_k(int k)
{
if(k==-1) head = ne[head];//如果k为头节点,那么需要改变head
else ne[k] = ne[ne[k]];
}
int main()
{
init();
cin>>M;
for(int i=0;i<M;i++)
{
char c;
cin>>c;
int k,x;
if(c=='H'){
cin>>x;
insert_head(x);
}else if(c=='D'){
cin>>k;
delete_k(k-1);
}else{
cin>>k>>x;
insert_K(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";
return 0;
}
2、双链表
用0表示head,1表示tail。
#include<iostream>
using namespace std;
const int N = 1e5+10;
int e[N],l[N],r[N],idx,m;
//初始化
void init()
{
//令head为0,tail为1
r[0] = 1;
l[1] = 0;
idx = 2;
}
//左插
void insert_left(int x)
{
l[idx] = 0;
r[idx] = r[0];
r[0] = idx;
l[r[idx]] = idx;
e[idx++] = x;
}
//右插
void insert_right(int x)
{
r[idx] = 1;
l[idx] = l[1];
r[l[idx]] = idx;
l[1] = idx;
e[idx++] = x;
}
//在第k个插入的数的右侧插入一个数
void insert_right_k(int k,int x)
{
r[idx] = r[k];
l[idx] = k;
l[r[idx]] = idx;
r[k] = idx;
e[idx++] = x;
}
//在第k个插入的数的左侧插入一个数
void insert_left_k(int k,int x)
{
l[idx] = l[k];
r[idx] = k;
r[l[idx]] = idx;
l[k] = idx;
e[idx++] = x;
}
//将第 k 个插入的数删除
void delete_k(int k)
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main()
{
cin>>m;
init();
while(m--)
{
string s;
int k,x;
cin>>s;
if(s=="L"){
cin>>x;
insert_left(x);
}else if(s=="R"){
cin>>x;
insert_right(x);
}else if(s=="D"){
cin>>k;
delete_k(k+1);
}else if(s=="IL"){
cin>>k>>x;
insert_left_k(k+1,x);
}else{
cin>>k>>x;
insert_right_k(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<" ";
return 0;
}
我淦我因为忘了init(),debug了半小时…
3、栈
3.1 模拟栈
数组模拟栈,挺简单的:
#include<iostream>
using namespace std;
const int N = 1e6+10;
int stk[N], tt, m;
void push(int x)
{
stk[tt++] = x;
}
void pop()
{
tt--;
}
void empty()
{
if(tt<=0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
int query()
{
return stk[tt-1];
}
int main()
{
string s;
int x;
cin>>m;
while(m--){
cin>>s;
if(s=="push") cin>>x,push(x);
else if(s=="pop") pop();
else if(s=="empty") empty();
else cout<<query()<<endl;
}
return 0;
}
3.2 表达式求值
难起来了uu们,我大一学数据结构的时候遇到这道题不会做,没想到大三了系统学算法了还是不会做。这样想想大一的自己有被安慰到orz。
#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
stack<int> num;
stack<char> op;
//优先级表
unordered_map<char, int>