C和C++实现数据结构队列

C语言实现数据结构队列

c语言实现顺序循环队列
#include <stdio.h>
#include <malloc.h>

#define OK 1
#define ERROR 0
#define MAXSIZE 10

typedef int Status;
typedef int ElemType;
// 循环队列的顺序存储结构
typedef struct SqQueue {
	ElemType array[MAXSIZE];
	// 头指针
	int front;
	// 尾指针
	int rear;
	int size;
}SqQueue;

// 初始化空队列
SqQueue* InitQueue() {
	SqQueue* s = NULL;
	s = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);
	if (s != NULL) {
		s->front = s->rear = 0;
		s->size = 0;
		return s;
	}
	return NULL;
}

// 元素入队
Status EnQueue(SqQueue* s, ElemType e) {
	// 首先判断是否队满
	if ((s->rear + 1) % MAXSIZE == s->front)
		return ERROR;
	else {
		s->array[s->rear] = e;
		// 尾指针后移
		s->rear = (s->rear + 1) % MAXSIZE;
		s->size++;
		return OK;
	}
}

// 队头元素出队
Status DeQueue(SqQueue* s) {
	// 首先判断队是否为空
	if (s->rear == s->front)
		return ERROR;
	else {
		// 头指针后移
		s->front = (s->front + 1) % MAXSIZE;
		s->size--;
		return OK;
	}
}

// 取出队头元素
ElemType getFront(SqQueue* s, ElemType* e) {
	if (s->rear == s->front)
		return ERROR;
	else {
		*e = s->array[s->front];
		return *e;
	}
}

int size(SqQueue* s) {
	return s->size;
}

int main()
{
	SqQueue* s = InitQueue();
	int value = 0;
	int i = 0;

	for (i = 0; i < 8; i++)
		EnQueue(s, i);

	printf("此时队列中元素个数为:%d\n", size(s));

	for (i = 0; i < 8; i++) {
		printf ("此时队头元素为: %d\n", getFront(s, &value));
		DeQueue(s);
	}
	
	printf("此时队列中元素个数为: %d\n", size(s));

	return 0;
}

c语言实现链式队列
#include <stdio.h>
#include <malloc.h>

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;
// 结点结构
typedef struct QNode
{
	ElemType value;
	struct QNode* next;
}QNode, *QueuePtr;

// 队列的链表结构
typedef struct
{
	// 队头队尾指针
	QueuePtr front, rear;
}LinkQueue;

// 初始化队列
Status InitQueue(LinkQueue* q) {
	QueuePtr Node = (QueuePtr)malloc(sizeof(QNode));
	if (Node != NULL) {
		q->front = q->rear = Node;
		q->front->next = NULL;
		return OK;
	} else {
		return ERROR;
	}
}

Status EnQueue(LinkQueue* q, ElemType e) {
	// 从堆空间申请一个结点
	QueuePtr node = (QueuePtr)malloc(sizeof(QNode));
	if (node != NULL) {
		node->value = e;
		node->next = NULL;
		// 把拥有元素e的新节点赋值给原队尾结点的后继
		q->rear->next = node;
		// 尾指针后移
		q->rear = node;
		return OK;
	} else {
		return ERROR;
	}
}

Status DeQueue(LinkQueue* q) {
	// 首先判断队元素是否为空
	if (q->front == q->rear)
		return ERROR;
	// 将欲删除的队头结点暂存给toDel
	QueuePtr toDel = q->front->next;
	// 将原队头结点后继赋值给头节点后继
	q->front->next = toDel->next;
	
	// 若队头是队尾则删除后将rear指向头节点
	if (q->rear == toDel)
		q->rear = q->front;

	free(toDel);
	return OK;
}

int size(LinkQueue* q) {
	int ret = 0;
	QueuePtr slider = q->front->next;
	while (slider != NULL) {
		ret++;
		slider = slider->next;
	}
	return ret;
}

// 获取队头元素
ElemType getFront(LinkQueue* q, ElemType* e) {
	if (q->front == q->rear)
		return ERROR;
	*e = q->front->next->value;
	
	return *e;
}

int main()
{
	LinkQueue s;
	int value = 0;
	int i;
	InitQueue(&s);
	for (i = 0; i < 10; i++)
		EnQueue(&s, i);

	printf("完成入队之后元素个数为: %d\n", size(&s));

	for (i = 0; i < 10; i++) {
		printf("此时队头元素为: %d\n", getFront(&s, &value));
		DeQueue(&s);
	}
	printf("完成出队之后元素个数为:  %d\n", size(&s));
	return 0;
}

c++实现数据结构队列

c++实现顺序循环队列
#include <iostream>
using namespace std;

template <typename T, int N>
class Queue
{
private:
	T m_space[N];
	// 头指针
	int m_front;
	// 尾指针
	int m_rear;
	// 元素个数
	int m_size;
public:
	Queue() {
		m_front = m_rear = m_size = 0;
	}
	
	// 元素入队操作
	bool EnQueue(const T& e) {
		// 首先判断是否队满
		if ((m_rear + 1) % N == m_front)
			return false;
		else {
			m_space[m_rear] = e;
			m_rear = (m_rear + 1) % N;
			m_size++;
			return true;
		}
	}
	
	// 元素出队操作
	bool DeQueue() {
		// 首先判断队是否为空
		if (m_front == m_rear)
			return false;
		else {
			// 头指针后移
			m_front = (m_front + 1) % N;
			m_size--;
			return true;
		}
	}
	
	// 获取队头元素
	T getFront(T& e) {
		if (m_front == m_rear)
			return -1;
		else {
			e = m_space[m_front];
			return e;
		}
	}

	int size() const {
		return m_size;
	}

};

int main() 
{
	Queue<int, 11> q;
	int e = 0;
	for (int i = 0; i < 10; i++)
		q.EnQueue(i);
	cout << "入队完成之后元素个数: " << q.size() << endl;

	for (int i = 0; i < 10; i++) {
		cout << "此时队头元素为: " << q.getFront(e) << endl;
		q.DeQueue();
	}
	cout << "出队完成之后元素个数: " << q.size() << endl;
}
C++实现链式队列
#include <iostream>
using namespace std;

template <typename T>
// 结点
struct Node
{
	T value;
	Node<T>* next;
	Node() {}
	Node(const T& val, Node<T>* theNext):value(val),next(theNext) {}
};

template <typename T>
class Queue
{
private:
	Node<T>* m_front;
	Node<T>* m_rear;
	int m_size;
public:
	Queue() {
		m_front = m_rear = NULL;
		m_size = 0;
	}
	
	// 向队中加入元素
	void EnQueue(const T& e) {
		// 从堆空间申请一个结点并初始化
		Node<T>* node = new Node<T>(e, NULL);
		
		if (node != NULL) {
			// 如果此时队为空
			if (m_size == 0)
				m_front = node;
			else
				m_rear->next = node;
			m_rear = node;
			m_size++;
		}
	}

	// 删除队头元素
	bool DeQueue() {
		if (m_front == NULL)
			return false;
		else {
			Node<T>* toDel = m_front->next;
			delete m_front;
			// 队头指针后移
			m_front = toDel;
			m_size--;
			return true;
		}
	}
	
	T front() {
		if (m_front == NULL)
			return -1;
		else
			return m_front->value;
	}

	bool empty() const {
		return m_size == 0;
	}

	int size() const {
		return m_size;
	}

};

int main()
{
	Queue<int> q;
	for (int i = 0; i < 10; i++)
		q.EnQueue(i);

	cout << "入队完成之后元素个数为: " << q.size() << endl;
	for (int i = 0; i < 10; i++) {
		cout << "此时队头元素为: " << q.front() << endl;
		q.DeQueue();
	}
	cout << "出队完成之后元素个数为:  " << q.size() << endl;
	return 0;
}

参考资料:

大话数据结构 c语言版
数据结构、算法与应用 c++语言描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值