算法导论答案 第10章:基本数据结构

本文探讨了栈和队列的基本概念,并提供了详细的算法实现,包括如何利用数组实现队列的各种操作,如入队、出队等,同时讨论了使用两个栈模拟队列以及两个队列模拟栈的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值