王道408考研课后习题---队列

一、队列的存储及其基本方法

  1. 顺序存储
// 队列的定义方式:
#define MAXSIZE 50
typedef struct {
	int data[MAXSIZE];
	int front, rear;
}SqQueue;
  • 普通队列的基本操作
//初始化
void initQueue(SqQueue &q){
	q.front = 0;
	q.rear = 0;
}
// 判空
q.rear == q.front;
// 普通队列判满
q.rear + 1 == MAXSIZE;
// 入队操作
bool enqueue(SqQueue &q, int x){
	if(q.rear + 1 == MAXSIZE) return false;
	q.data[q.rear] = x;
	q.rear ++;
	return true;
}
// 出队操作
bool dequeue(SqQueue &q,int &x){
	if(q.rear == q.front) return false;
	x = q.data[q.front];
	q.front++;
	return true;
}
  • 循环队列
//初始化
void initQueue(SqQueue &q){
	q.front = 0;
	q.rear = 0;
}
// 循环队列判满 
q.front == (q.rear + 1) % MAXSIZE;
// 队列中的基本元素个数
(q.rear - q.front + MAXSIZE) % MAXSIZE;
// 入队操作
bool enqueue(SqQueue &q, int x){
	if(q.front == (q.rear + 1) % MAXSIZE) return false;
	q.data[q.rear] = x;
	q.rear = (q.rear + 1) % MAXSIZE;
	return true;
}
// 出队操作
bool dequeue(SqQueue &q,int &x){
	if(q.rear == q.front) return false;
	x = q.data[q.front];
	q.front = (q.front + 1) % MAXSIZE;
	return true;
}
  1. 链式存储
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;
typedef struct{
	LinkNode *front,*rear;
}*LinkQueue;

// 初始化
void initQueue(LinkQueue &q){
	q.front = new LinkNode;
	q.rear = q.front;
	q.front->next = NULL;
}
// 判空
bool isEmpty(LinkQueue &q){
	return q.front == q.rear;
}
// 入队
bool enqueue(LinkQueue &q, int x){
	LinkNode *s = new LinkNode;
	s->data = x;
	q.rear->next = s;
	q.rear = s;
	s->next = NULL;
}
// 出队
bool dequeue(LinkQueue &q, int &x){
	if(q.rear == q.front) return false;
	LinkNode *p = q.front->next;
	x = p->data;
	q.front->next = p->next;
	if(p == q.rear) q.rear = q.front;
	free(p);
	return true;
}

二、习题

第一题:

在循环队列中,设置一个标志域tag,并以tag的值为0和1来区分队头指针front和rear相同的状态是空还是满,然后编写出入对算法。
基本思想:

  1. tag进队置为1,出队置为0.
  2. 队空条件:q.front == q.rear && q.tag == 0
  3. 队满条件:q.front == q.rear && q.tag == 1
#define MAXSIZE 50
typedef struct {
	int data[MAXSIZE];
	int front, rear;
	int tag;
}SqQueue;

int enqueue(SqQueue &q,int x){
	if(q.front == q.rear && q.tag == 1) return 0;
	q.data[q.rear] = x;
	q.rear = (q.rear + 1) % MAXSIZE;
	q.tag = 1;
	return 1;
}
int dequeue(SqQueue &q, int &x){
	if(q.front == q.rear && q.tag == 0) return 0;
	x = q.data[q.front];
	q.front = (q.front + 1) % MAXSIZE;
	q.tag = 0;
	return 1;
}

第二题:

利用栈将队列的元素逆置

void reverse(SqQueue &q,Stack s){
	while(!isEmpty(q)){
		int x = dequeue(q);
		push(s, x);
	}
	while(!isEmpty(s)){
		int x = pop(s);
		dequeue(q, x);
	}
}

第三题:

利用两个栈来模拟队列
算法思路:
入队的数据直接存放在S1栈
出队的时候,将数据依次出栈入栈到S2中,弹出栈顶元素即可,最后将S2的数据再一次出栈入栈到S1中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值