【数据结构】队列定义及其常用的基本操作(C/C++)

简介: 队列定义及其常用的基本操作(C/C++)

●图示(以顺序队列为例)

df79472b03aac42eb8d89f1dae32d989_704240c506684fafa73c5f06bffc4383.png


●队列类型定义

●顺序队列

1.顺序队列存储结构的定义

typedef struct {
  qelemtype* base;
  int front;  //头指针
  int rear;   //尾指针
}SqQueue;

实例如下:

typedef struct {
  string name;
}qelemtype;
typedef struct {
  qelemtype* base;
  int front;
  int rear;
}SqQueue;

●链式队列

1.链式队列存储结构的定义

typedef struct Qnode {
  QElemType data;  //数据域
  struct Qnode* next; //指向下一结点的指针域
}Qnode, * QueneP;
typedef struct {
  QueneP front;  //头指针
  QueneP rear;   //尾指针
}LinkQueue;

实例如下:

typedef struct {
  string name;  
}QElemType;
typedef struct Qnode {
  QElemType data;  //数据域
  struct Qnode* next; //指向下一结点的指针域
}Qnode, * QueneP;
typedef struct {
  QueneP front;  //头指针
  QueneP rear;   //尾指针
}LinkQueue;

●常用的基本操作

●顺序队列

1.队列的初始化

void Initqueue(SqQueue& Q)
{
  Q.base = new qelemtype[MAXQSIZE];
  if (!Q.base)
  exit;
  Q.front = Q.rear = 0;
}

2. 求队列的长度

int QueueLength(SqQueue& Q)
{
  return ((Q.rear - Q.front + MAXQSIZE) % MAXQSIZE);
}

3. 队列入队

int EnQueue(SqQueue& Q, qelemtype e) {
  if ((Q.rear + 1) % MAXQSIZE == Q.front)
  {
  return 0;  //判断队满 
  }
  Q.base[Q.rear] = e; //新元素加入队尾 
  Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1
  return 1;
}

4. 队列出队

int DeQueue(SqQueue& Q, qelemtype& e) {
  if (Q.front == Q.rear)
  {
  return 0; //判断队空 
  }
  e = Q.base[Q.front];  //保存队头元素 
  Q.front = (Q.front + 1) % MAXQSIZE;   //队头指针加1 
  return 1;
}

5. 取队头元素

qelemtype GetHead(SqQueue &Q) {
  if (Q.front != Q.rear)
  return Q.base[Q.front];
}

6.清空队列

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

●链式队列

1.链队列初始化


int InitQueue(LinkQueue& Q) {
  Q.front = Q.rear = new Qnode;
  if (!Q.front)
  {
  exit(0);
  }
  Q.front->next = NULL;
  return 1;
}

2. 链队列入队

int EnQueue(LinkQueue& Q, QElemType e) {
  Qnode* p;
  p = new Qnode;
  if (!p) exit(OVERFLOW);
  p->data = e;
  p->next = NULL;
  Q.rear->next = p;
  Q.rear = p;
  return 1;
}

3. 链队列出队

int DeQueue(LinkQueue& Q, QElemType e) 
{
  Qnode* p;
  if (Q.front == Q.rear)
  {
  return 0;
  }
  p = Q.front->next;
  e = p->data;
  Q.front->next = p->next;
  if (Q.rear == p) Q.rear = Q.front;
  delete p;
  return 1;
}

4.求链队列的队头元素

void GetHead(LinkQueue Q) 
{
  QElemType e;
  e = Q.front->next->data;
  cout << e.name << endl;
}

●简单案例

1.顺序队列(这里实现用顺序队列依次入队5个学生,并查看此时队列人数,在进行出队操作,再查看此时队列人数。若进行其他操作,对代码进行简单修改即可)

#include<iostream>
#include<string>
#define MAXQSIZE 100   
using namespace std;
//数据准备
typedef struct {
  string name;
}qelemtype;
typedef struct {
  qelemtype* base;
  int front;
  int rear;
}SqQueue;
//队列的初始化
void Initqueue(SqQueue& Q)
{
  Q.base = new qelemtype[MAXQSIZE];
  if (!Q.base)
  exit;
  Q.front = Q.rear = 0;
}
//求队列的长度
int QueueLength(SqQueue& Q)
{
  return ((Q.rear - Q.front + MAXQSIZE) % MAXQSIZE);
}
//队列入队
int EnQueue(SqQueue& Q, qelemtype e) {
  if ((Q.rear + 1) % MAXQSIZE == Q.front)
  {
  return 0;  //判断队满 
  }
  Q.base[Q.rear] = e; //新元素加入队尾 
  Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1
  return 1;
}
//队列出队
int DeQueue(SqQueue& Q, qelemtype& e) {
  if (Q.front == Q.rear)
  {
  return 0; //判断队空 
  }
  e = Q.base[Q.front];  //保存队头元素 
  Q.front = (Q.front + 1) % MAXQSIZE;   //队头指针加1 
  return 1;
}
//取队头元素
qelemtype GetHead(SqQueue &Q) {
  if (Q.front != Q.rear)
  return Q.base[Q.front];
}
//清空队列
void clearQueue(SqQueue& Q)
{
  Q.front = 0;
  Q.rear = 0;
}
void showfunc()
{
  cout << "1.队列的初始化" << endl;
  cout << "2.求队列的长度" << endl;
  cout << "3.队列入队" << endl;
  cout << "4.队列出队" << endl;
  cout << "5.取队头元素" << endl;
  cout << "6.清空队列" << endl;
}
void text()
{
  SqQueue Q;
  qelemtype q;
  while (1)
  {
  showfunc();
  cout << "#要执行的操作#" << endl;
  int n;
  cin >> n;
  switch (n) 
  {
  case 1:
    Initqueue(Q);
    cout << "初始化成功" << endl;
    break;
  case 2:
    int len;
    len=QueueLength(Q);
    cout << "此时队列长度为" << len << endl;
    break;
  case 3:
    cout << "请输入要入队的学生人数" << endl;
    int num;
    cin >> num;
    for (int i = 1; i <= num; i++)
    {
    cin >> q.name;
    EnQueue(Q, q);
    }
    cout << "入队成功" << endl;
    break;
  case 4:
    DeQueue(Q, q);
    cout << "出队成功" << endl;
    break;
  }
  system("pause");
  system("cls");
  }
}
int main()
{
  text();
}


2.链式队列 (这里实现用链式队列依次入队5个学生,并查看此时队头;进行二次出队操作后,再查看此时队头;若进行其他操作,对代码进行简单修改即可)

#include<iostream>
#include<string>
#define maxqsize 100
using namespace std;
//数据准备
typedef struct {
  string name;  
}QElemType;
typedef struct Qnode {
  QElemType data;  //数据域
  struct Qnode* next; //指向下一结点的指针域
}Qnode, * QueneP;
typedef struct {
  QueneP front;  //头指针
  QueneP rear;   //尾指针
}LinkQueue;
//链队列初始化s
int InitQueue(LinkQueue& Q) {
  Q.front = Q.rear = new Qnode;
  if (!Q.front)
  {
  exit(0);
  }
  Q.front->next = NULL;
  return 1;
}
//链队列入队
int EnQueue(LinkQueue& Q, QElemType e) {
  Qnode* p;
  p = new Qnode;
  if (!p) exit(OVERFLOW);
  p->data = e;
  p->next = NULL;
  Q.rear->next = p;
  Q.rear = p;
  return 1;
}
//链队列出队
int DeQueue(LinkQueue& Q, QElemType e) 
{
  Qnode* p;
  if (Q.front == Q.rear)
  {
  return 0;
  }
  p = Q.front->next;
  e = p->data;
  Q.front->next = p->next;
  if (Q.rear == p) Q.rear = Q.front;
  delete p;
  return 1;
}
//求链队列的队头元素
void GetHead(LinkQueue Q)
{
  QElemType e;
  e = Q.front->next->data;
  cout << e.name << endl;
}
void text()
{
  LinkQueue Q;
  QElemType d;
  InitQueue(Q);
  cout << "#初始化成功#" << endl;
  cout << "请输入入队人数:" << endl;
  int num;
  cin >> num;
  for (int i = 1; i <= num; i++)
  {
  cin >> d.name;
  EnQueue(Q,d);
  }
  cout << "#入队成功#" << endl;
  cout << "此刻队头元素为:" << endl;
  GetHead(Q);
  DeQueue(Q, d);
  cout << "#出队成功#" << endl;
  cout << "此刻队头元素为:"  << endl;
  GetHead(Q);
  DeQueue(Q, d);
  cout << "#出队成功#" << endl;
  cout << "此刻队头元素为:" << endl;
  GetHead(Q);
}
int main()
{
  text();
}

9ec9d9754927a9bd7d80a61cfd29b71c_625d5ecbf9004ca5a59c87daffe01c23.png

目录
相关文章
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
10天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
33 4
|
18天前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
32 7
|
18天前
|
消息中间件 存储 安全
|
20天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
初步认识栈和队列
初步认识栈和队列
60 10
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
30 2
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
17 0
|
1月前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用