代码模板在最后!代码模板在最后!代码模板在最后!
练习10.1-6 两个栈实现一个队列
stack a, b;
ENQUEUE(x)函数
a.push(x)
DEQUEUE()函数
if(!b.empty()) b.pop()
else{将a全部依次出栈转移到b;
b.pop();}
练习10.1-7 两个队列实现一个栈
queue a, b;
push(x)函数
插入非空队列
pop()函数
非空队列弹出n-1个元素到空队列
弹出剩下那个元素
队列长度 - - ;
练习10.2-7 单链表的就地逆置
断开头节点与后面的节点
采用头插法依次插入后面节点的元素
练习10.2-8:
如何在每个节点只有一个指针空间的条件下实现双向链表?
定义:x.np = x.next XOR x.pre
x.pre = x.np XOR x.next
x.next = x.np XOR x.pre
两头:NULL
(因为:x.np = 0 XOR x.next = x.next)
数据结构的数组表示(单数组)以双向链表举例
int a[N];
if N%3 == 0
a[N] = num;
else if N%3 == 1
a[N] = pre;
else if N%3 == 2
a[N] = next;
练习10.4-6 用两个指针和一个bool值,实现能在和孩子数量成线性的时间内访问所有孩子节点或者父节点的左孩子右兄弟树。
第一个指针存左孩子
当bool = 0 第二个指针存parent
否则存右兄弟
(1) 链接法
int h[N], e[N], ne[N], idx;
// 向哈希表中插入一个数
void insert(int x)
{
int k = (x % N + N) % N;
e[idx] = x;
ne[idx] = h[k];
h[k] = idx ++ ;
}
// 在哈希表中查询某个数是否存在
bool find(int x)
{
int k = (x % N + N) % N;
for (int i = h[k]; i != -1; i = ne[i])
if (e[i] == x)
return true;
return false;
}
(2) 开放寻址法
int h[N];
// 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置
int find(int x)
{
int t = (x % N + N) % N;
while (h[t] != null && h[t] != x)
{
t ++ ;
if (t == N) t = 0;
}
return t;
}
单链表
// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;
// 初始化
void init()
{
head = -1;
idx = 0;
}
// 在链表头插入一个数a
void insert(int a)
{
e[idx] = a, ne[idx] = head, head = idx ++ ;
}
// 将头结点删除,需要保证头结点存在
void remove()
{
head = ne[head];
}
双链表
// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;
// 初始化
void init()
{
//0是左端点,1是右端点
r[0] = 1, l[1] = 0;
idx = 2;
}
// 在节点a的右边插入一个数x
void insert(int a, int x)
{
e[idx] = x;
l[idx] = a, r[idx] = r[a];
l[r[a]] = idx, r[a] = idx ++ ;
}
// 删除节点a
void remove(int a)
{
l[r[a]] = l[a];
r[l[a]] = r[a];
}
栈
// tt表示栈顶
int stk[N], tt = 0;
// 向栈顶插入一个数
stk[ ++ tt] = x;
// 从栈顶弹出一个数
tt -- ;
// 栈顶的值
stk[tt];
// 判断栈是否为空
if (tt > 0)
{
}
队列
// hh 表示队头,tt表示队尾
int q[N], hh = 0, tt = -1;
// 向队尾插入一个数
q[ ++ tt] = x;
// 从队头弹出一个数
hh ++ ;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh <= tt)
{
}
循环队列
// hh 表示队头,tt表示队尾的后一个位置
int q[N], hh = 0, tt = 0;
// 向队尾插入一个数
q[tt ++ ] = x;
if (tt == N) tt = 0;
// 从队头弹出一个数
hh ++ ;
if (hh == N) hh = 0;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh != tt)
{
}
本文仅作为私人分享学习使用
参考资料:
课后练习10.2-8:https://blog.csdn.net/sinat_16709955/article/details/77611955
模板参考:
网址:https://www.acwing.com/blog/content/404/
来源:ACWING
作者:yxc