数据结构 |
变量 |
初始化 |
备注 |
单链表 |
int head, e[N], ne[N], idx; |
head = -1; idx = 0; |
删除操作头结点的特判; idx 从0 开始,第k个下标为 k-1 |
双链表 |
int head, e[N], ne[N], idx; |
r[0] = 1; l[1] = 0; idx = 2; |
idx 从2 开始,第k个下标为K+1 |
栈 |
int stk[N], tt ; |
tt = 0; |
void pop() 注意对tt的下标合法性判断 |
队列 |
int q[N], hh, tt; |
hh = 0; tt = -1; |
|
#include <iostream>
using namespace std;
const int N = 100010;
// head 头节点的下标
// e[i] 节点i的值
// ne[i] 节点i的next指针是多少
// idx 存储当前目前可用的'结点' 可看做指针
// 静态链表
int head, e[N], ne[N], idx;
// 初始化
void init()
{
head = -1; // head 指向空
idx = 0;
}
// 将x插入到头结点 头插
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head; // idx 指向 head 指向的东西
head = idx; // head 指向 idx
idx ++;
}
// 将x插到到小标为k的结点后面
void add(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++;
}
// 将下标为K后面的点删除
void remove(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
int m;
cin >> m;
init();
while(m --)
{
int k ,x;
char op;
cin >> op;
if(op == 'H')
{
cin >> x;
add_to_head(x);
}
else if(op == 'D')
{
cin >> k ;
if(!k) head = ne[head]; // 对删除头结点特判
remove(k - 1);
}
else
{
cin >> k >> x;
add(k -1 , x);
}
}
for(int i = head; i != -1; i = ne[i])
cout << e[i] << ' ';
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int m;
int e[N],l[N],r[N],idx;
// 0是左端点,1是右端点
void init()
{
r[0] = 1; // 0的右边指向1
l[1] = 0; // 1的左边指向0
idx = 2;
}
// 在下标为K 的右边插入x
// 在K的左边插入相当于在 k的左边的后边插入 add(l[k], x);
void add(int k ,int x)
{
e[idx] = x;
r[idx] = r[k]; // 新的右边
l[idx] = k; // 新的左边
l[r[k]] = idx; // 后面的左边
r[k] = idx; // 前面的右边
idx ++;
}
// 删除第k的点
void remove(int k)
{
r[l[k]] = r[k]; // 从内往外读 左边的右边
l[r[k]] = l[k];
}
int main()
{
cin >> m;
init(); // 别忘了初始化
while(m --)
{
int k ,x;
string op;
cin >> op;
if(op == "L")
{
cin >> x ;
add(0, x);
}
else if (op == "R")
{
cin >> x ;
add(l[1], x);
}
else if (op == "D")
{
cin >> k ;
if(!k)
{
r[0] = 1; // 0的右边指向1
l[1] = 0;
}
remove(k + 1); // 坐标从 0 开始 是 -1 以为2基准 那就得 +1
}
else if (op == "IL")
{
cin >> k >> x;
add(l[k + 1], x);
}
else
{
cin >> k >> x;
add(k + 1, x);
}
}
for(int i = r[0] ; i != 1; i = r[i])
cout << e[i] << ' ';
return 0;
}
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int stk[N], tt;
void push(int x)
{
stk [++ tt] = x;
}
void pop ()
{
if(tt) tt --; // 注意这个判断
}
bool empty()
{
return tt == 0;
}
int query()
{
return stk[tt];
}
int main()
{
int m;
cin >> m;
while(m--)
{
string op;
int x;
cin >> op;
if(op == "push")
{
cin >> x;
push(x);
}
else if(op == "pop")
{
pop();
}
else if(op == "empty")
{
cout << (empty() ? "YES" :"NO") << endl;
}
else
{
cout << query() << endl;
}
}
return 0;
}
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
// head - hh tail - tt
int q[N], hh, tt = -1;
void push(int x)
{
q [++ tt] = x;
}
void pop ()
{
hh ++;
}
bool empty()
{
return hh > tt;
}
int query()
{
return q[hh];
}
int main()
{
int m;
cin >> m;
while(m--)
{
string op;
int x;
cin >> op;
if(op == "push")
{
cin >> x;
push(x);
}
else if(op == "pop")
{
pop();
}
else if(op == "empty")
{
cout << (empty() ? "YES" :"NO") << endl;
}
else
{
cout << query() << endl;
}
}
return 0;
}
大佬那个 单链表删头结点的时候k=0 不就remove(-1) 了吗 访问数组下标没负数啊..