10.1 栈和队列
10.1-2
从数组的两端向数组的中间插入元素。数组的两端相当于2个栈的栈顶。
10.1-4
ENQUEUE(Q,x)
{
if head[Q]=(tail[Q]+1)%length[Q] //队列满时分为两种情况,一种是head指向位置1,tail指向n;另一种是其他情况
error "Queue overflow"
else
Q[tail[Q]]=x
if tail[Q]=length[Q]
tail[Q]=1
else
tail[Q]=tail[Q]+1
}
DEQUEUE(Q)
{
if head[Q]=tail[Q]
error "Queue underflow"
else
x=Q[head[Q]]
if head[Q]=length[Q]
head[Q]=1
else
head[Q]=head[Q]+1
return x
}
10.1-5
LEFT_INSERT_DEQUE(Q,x) //从数组的左端插入元素
{
if (tail[Q]+1)%n==head[Q]
error "overflow"
if head[Q]=1
Q[n]=x
head[Q]=n
else
Q[head[Q]-1]=x
head[Q]=head[Q}-1
}
RIGHT_INSERT_DEQUE(Q,x) //从数组的右端插入元素
{
if (tail[Q]+1)%n==head[Q]
error "overflow"
else
Q[tail[Q]]=x
if tail[Q]=length[Q]
tail[Q]=1
else
tail[Q]=tail[Q]+1
else
error "overflow"
}
LEFT_DELETE_DEQUE(Q)
{
if head[Q]=tail[Q]
error "underflow"
else
x=Q[head[Q]]
if head[Q]=n
head[Q]=1
else
head[Q]=head[Q]+1
return x
}
RIGHT_DELETE_DEQUE(Q)
{
if head[Q]=tail[Q]
error "underflow"
else
if tail[Q]=1
x=Q[n]
tail[Q]=n
else
x=Q[tail-1]
tail[Q}=tail[Q]-1
return x
}
10.1-6
使用栈S1和S2
入队:将元素压入栈S1 运行时间:O(1)
出队:将栈S1中的所有的元素弹出,压入到栈S2,然后弹出栈顶元素即可 运行时间:O(n)
10.1-7
使用队列Q1和Q2
入栈:Q1和Q2两者之中有一个空队列,将值入空队列,然后把另一个队列中的所有值依次出队并加入到这个队列 运行时间:O(n)
出栈:直接将非空队列中出队 运行时间:O(1)
10.2 链表
10.2-1
INSERT可以,DELETE操作可以在O(1)的时间内删除一个元素,但如果是删除一个具有给定关键字的元素时,则不可以,这时的最坏情况下的时间为O(n)
10.2-2
PUSH时将元素插入到单链表的前端,POP时删除链表的第一个元素
10.2-3
增加尾指针,ENQUEUE时将元素插入到链表的前端,DEQUEUE时把尾指针指向的元素删除。
10.2-4
将哨兵的值设为要查找的值,判断找到的值的下标是否是哨兵。
10.2-5
INSERT O(1) DELETE,SEARCH O(n)
10.2-6
S1和S2都使用链表,链表中有头指针和尾指针。UNION时,只需将S1的尾指针指向S2的头指针即可。
10.2-7
void transposeLink(Link *link)
{
Node *p, *pre, *cur, *head;
head = link->head;
p = head->next;
//空链表或只有一个节点则不需要转置
if(p == NULL || p->next == NULL) {
return;
}
pre = p;
p = p->next;
pre->next = NULL;
while (p) {
cur = p;
p = p->next;
cur->next = pre;
pre = cur;
}
head->next = cur;
}