链队列的基本操作(C++)

#pragma once
//===================链队===================
/*链队列是基于链表实现的队列:链表头部为队首,链表尾部为队尾*/

template<typename T>
struct QueueNode
{
	T value;
	QueueNode<T> *next;

	struct QueueNode(T x) :value(x), next(nullptr){};
};

template<typename T>
class LinkQueue
{
public:
	LinkQueue();
	~LinkQueue();

	bool isEmpty();
	int size();
	bool mypop();
	void mypush(T t);
	T front();

private:
	QueueNode<T> *phead;
	QueueNode<T> *pend;
	int count;
};

template<typename T>
LinkQueue<T>::LinkQueue()
{
	phead = new QueueNode<T>(0);
	pend = phead;
	count = 0;
}


template<typename T>
LinkQueue<T>::~LinkQueue()
{
	while (phead->next != nullptr)
	{
		QueueNode<T> *tmpNode = phead;
		phead = phead->next;
		delete tmpNode;
	}
}

template<typename T>
bool LinkQueue<T>::isEmpty()
{
	return count == 0;
}

template<typename T>
int LinkQueue<T>::size()
{
	return count;
}

//队尾插入
template<typename T>
void LinkQueue<T>::mypush(T t)
{
	QueueNode<T> *tmpNode = new QueueNode<T>(t);
	pend->next = tmpNode;
	pend = tmpNode;
	count++;
}

//在队首删除
template<typename T>
bool LinkQueue<T>::mypop()
{
	if (count == 0)
	{
		cout << "空队" << endl;
		return false;
	}
	else
	{
		QueueNode<T> *tmpNode = phead->next;
		phead->next = phead->next->next;
		delete tmpNode;
		return true;
	}
}

//获取队首元素
template<typename T>
T LinkQueue<T>::front()
{
	if (count == 0)
	{
		cout << "空队" << endl;
		return false;
	}
	else
		return	 phead->next->value;
}


int main()
{
	//==========链队===========
	LinkQueue<int> *lqueue = new LinkQueue<int>();
	int n;
	while (cin >> n)
		lqueue->mypush(n);

	cout << "队列大小:" << lqueue->size() << endl;
	while (!lqueue->isEmpty())
	{
		cout << lqueue->front() << " ";
		lqueue->mypop();
	}

	cout << endl;
}

链队列是通过链表实现的队列链队列基本操作包括: 1. 初始化:初始化一个空的链队列。 2. 入队:将一个元素插入队列尾部。 3. 出队:删除队头元素,并返回其值。 4. 取队头元素:返回队头元素的值。 5. 判空:判断链队列是否为空。 6. 遍历:按顺序输出队列中的所有元素。 以下是链队列基本操作实现的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> // 链队列结点的结构体 struct Node { int data; struct Node *next; }; // 链队列的结构体 typedef struct { struct Node *front; // 队头指针 struct Node *rear; // 队尾指针 } LinkQueue; // 初始化链队列 void initQueue(LinkQueue *Q) { Q->front = Q->rear = (struct Node *) malloc(sizeof(struct Node)); Q->front->next = NULL; } // 判断链队列是否为空 int isEmpty(LinkQueue *Q) { return Q->front == Q->rear; } // 元素入队 void enQueue(LinkQueue *Q, int x) { struct Node *newNode = (struct Node *) malloc(sizeof(struct Node)); newNode->data = x; newNode->next = NULL; Q->rear->next = newNode; Q->rear = newNode; } // 元素出队 int deQueue(LinkQueue *Q) { if (isEmpty(Q)) { printf("队列已空,不能删除元素!\n"); exit(1); } else { struct Node *p = Q->front->next; int x = p->data; Q->front->next = p->next; if (Q->rear == p) { Q->rear = Q->front; } free(p); return x; } } // 取队头元素 int getFront(LinkQueue *Q) { if (isEmpty(Q)) { printf("队列已空,没有队头元素!\n"); exit(1); } else { return Q->front->next->data; } } // 遍历链队列 void traverseQueue(LinkQueue *Q) { struct Node *p = Q->front->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { LinkQueue Q; initQueue(&Q); enQueue(&Q, 1); enQueue(&Q, 2); enQueue(&Q, 3); enQueue(&Q, 4); printf("遍历队列:"); traverseQueue(&Q); printf("队头元素:%d\n", getFront(&Q)); printf("出队元素:%d\n", deQueue(&Q)); printf("出队元素:%d\n", deQueue(&Q)); printf("遍历队列:"); traverseQueue(&Q); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值