考研复习之队列

发布于:2025-03-24 ⋅ 阅读:(29) ⋅ 点赞:(0)

循环队列

队列为满的条件

      队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 rear + 1 和 front 是否相等,因为 rear + 1 可能会超出数组索引的范围。因此,我们需要使用模运算 % 来确保索引在数组范围内循环。

        

        浪费一个空间:
        在这种方法中,我们故意让队列中始终保持一个空闲位置,这样当 rear 的下一个位置是 front 时,队列就是满的。

(Q.rear + 1) % MAX_SIZE == Q.front

入队  出队

#include<iostream>
#define Maxsize 6
using namespace std;

typedef struct {
    int data[Maxsize]; // 数组,存储Maxsize-1个元素
    int front, rear;   // 队列头和队列尾
} SqQueue;

void init(SqQueue &Q) {
    Q.front = Q.rear = 0;
}

bool enqueue(SqQueue &Q, int x) {
    if ((Q.rear + 1) % Maxsize == Q.front) // 判断循环队列是否满了
        return false;
    else {
        Q.data[Q.rear] = x; // 放入元素
        Q.rear = (Q.rear + 1) % Maxsize; // 改变队尾标记
        return true;
    }
}

bool dequeue(SqQueue &Q, int &data) {
    if (Q.rear == Q.front) // 判断队列是否为空
        return false;
    else {
        data = Q.data[Q.front]; // 取出队头元素
        Q.front = (Q.front + 1) % Maxsize; // 改变队头标记
        return true;
    }
}

bool isEmpty(SqQueue Q) {
    return Q.rear == Q.front;
}



int main() {
    SqQueue Q;
    bool ret;
    int data;
    init(Q); // 初始化队列

    ret = isEmpty(Q);
    if (ret) {
        cout << "kong" << endl;
    } else {
        cout << "bu wei kong " << endl;
    }

    ret = dequeue(Q, data);
    if (ret) {
        cout << "出队的元素是" << data << endl;
    } else {
        cout << "kong zhan" << endl;
    }

    // 测试入队和出队
    enqueue(Q, 1);
    enqueue(Q, 2);
    enqueue(Q, 3);
    enqueue(Q, 4);
    enqueue(Q, 5);

   
    while (dequeue(Q, data)) {
        cout << "出队的元素是" << data << endl;
    }

    return 0;
}

链队列

用链表表示队列

#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct node {
	int data;
	struct node *next;
}LinkNode; 

typedef struct {
	LinkNode * front ,* rear;//链表头,链表尾,即对头和队尾 
}LinkQueue;

//用带头结点的链表来实现队列 
void init(LinkQueue &Q)
{
	Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode)); 
	Q.front->next=NULL;
}


void enqueue(LinkQueue &Q,int x)
{
	LinkNode *newnode;
	newnode=(LinkNode *)malloc(sizeof(LinkNode));
	newnode->data=x;
	Q.rear->next=newnode;
	Q.rear=newnode;//rear指向新的尾部 
	newnode->next=NULL;
	
}

int dequeue(LinkQueue &Q,int &data)
{
	if(Q.rear==Q.front )
	{
		cout<<"栈空"<<endl;
	}
	else
	{
		LinkNode * q=Q.front->next;//指向第一个元素 
		Q.front->next=q->next;
		data=q->data; //获取出队的元素值 
		if(Q.rear=q)//队列只剩一个元素,被删除后要改变rear; 
		{
			Q.front=Q.rear;
		}
	}
	return data;
}
bool IsEmpty(LinkQueue Q)
{
	if(Q.front==Q.rear )
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	LinkQueue Q;
	init(Q); 
	enqueue(Q,1);
	enqueue(Q,2);
	enqueue(Q,3);
	enqueue(Q,4);
	enqueue(Q,5);
	int data;
	data=dequeue(Q,data);
	cout<<"出对的元素值是"<<data<<" "<<endl;
	return 0;
	
}


网站公告

今日签到

点亮在社区的每一天
去签到