数据结构实验之队列(文末附完整代码)

目录

(1)队的定义

(2)队的基本操作:

 完整代码:

main.c部分:

 SeqQueue.c部分

SeqQueue.h部分


队列是一种线性数据结构,用于在程序中按照特定顺序组织和操作元素。它遵循先进先出(First-In-First-Out,FIFO)的原则,即最先进入队列的元素最先被处理,而最后进入的元素最后被处理。

队列可以类比为现实生活中的排队场景,人们按照到达的先后顺序排队等待服务。类似地,队列中的元素也按照顺序加入队列并离开队列。

队列有两个主要操作:

  1. 入队(enqueue):将元素添加到队列的尾部。
  2. 出队(dequeue):从队列的头部移除并返回元素。

这两个操作使得队列满足了先进先出的特性。新元素总是被添加到队列的末尾,而从队列中移除元素时,总是从队列的开头进行。

除了入队和出队操作之外,队列还可以提供其他一些常见的操作,如:

  • 获取队列的长度
  • 检查队列是否为空
  • 获取队列的头部元素,但不删除它

队列的应用非常广泛,例如:

  • 高级语言编译器中的编译错误消息队列
  • 操作系统中的进程调度
  • 网络通信中的数据包缓冲区
  • 广度优先搜索算法(BFS)
  • 银行柜台的客户排队等待服务

(1)队的定义

typedef int ElemType;//定义队列中元素类型

#define MAXSIZE 100 //定义队列初始存储空间大小

typedef struct SeqQueue  //定义队列结构

{

    ElemType *base; //队列存储空间基地址

    int front;  // 队列头

    int rear;  // 队列尾

    int size;  // 队列中元素数量

} SeqQueue;

这段代码定义了一个顺序队列(Sequential Queue)的数据结构。以下是对每个部分的解释:

  1. typedef int ElemType;:这段代码定义了队列中元素的类型为整数(int)。你可以根据需求将其修改为其他类型。

  2. #define MAXSIZE 100:这段代码定义了队列的初始存储空间大小,该队列最多可以容纳100个元素。你可以根据实际需要修改这个值。

  3. typedef struct SeqQueue:这是定义顺序队列的开始。

  4. ElemType *base:这是队列存储空间的基地址,它是一个指向元素类型(ElemType)的指针。

  5. int front:这是队列的头部指针,指向队列中第一个元素。

  6. int rear:这是队列的尾部指针,指向队列中最后一个元素的下一个位置。

  7. int size:这是队列中元素的数量。通过front和rear之间的位置关系可以计算得出。

 

(2)队的基本操作:

void initQueue(SeqQueue *s);//初始化队列

代码:

// 初始化队列

void initQueue(SeqQueue *q) {

    q->base=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);

    q->front=q->rear=0;

    q->size=0;

}

这个函数可以用来初始化一个队列。它会为队列分配一块存储空间,并将队列的头部指针、尾部指针和元素数量都设置为初始值,使得队列处于空的状态。你可以调用这个函数来初始化一个队列,然后就可以对这个队列进行入队和出队操作了 

bool isQueueFull(SeqQueue *s);//判断队列是否已满

代码:

bool isQueueFull(SeqQueue *q) {

    if(q->size==MAXSIZE){

        return true;

    }

    else return false;

}

这段代码是一个函数,用于判断队列是否已满的函数。该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。以下是对每行代码的解释:

bool isQueueFull(SeqQueue *q) 
 

这是函数的声明,它定义了一个名为 isQueueFull 的函数,该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。

if(q->size==MAXSIZE);

这行代码判断队列中元素的数量 (size) 是否等于队列的最大容量 (MAXSIZE)。如果相等,表示队列已满,执行下面的代码块。

如果队列已满,返回 true

如果队列未满,返回 false

bool isQueueEmpty(SeqQueue *s);//判断队列是否为空

代码:

// 判断队列是否为空

bool isQueueEmpty(SeqQueue *q) {

    if(q->size==0){

        return true;

    }

    else return false;

}

 

用于判断队列是否为空的函数。以下是对代码的解释:

 
 

这是函数的声明,它定义了一个名为 isQueueEmpty 的函数,该函数接受一个指向 SeqQueue 结构的指针作为参数,并返回布尔值 (truefalse)。

 
 

这行代码判断队列中元素的数量 (size) 是否等于 0。如果相等,表示队列为空,执行下面的代码块。

 
 

如果队列为空,返回 true

 
 

如果队列不为空,返回 false

void enqueue(SeqQueue *s,ElemType x);//入队

代码:

// 入队操作

void enqueue(SeqQueue *q, ElemType item) {

q->base[q->rear++]=item;

q->size++;

该函数接受一个指向 SeqQueue 结构的指针 q 和一个要入队的元素 item。它将元素 item 存储在队列的 rear 所指向的位置,并将队列的 rear 值加一。然后,它将队列中元素的数量 size 加一表示队列长度增加了一个元素。

这个函数用于往队列中添加元素,实现了队列的入队操作。调用这个函数可以将指定元素添加到队列的末尾。

 

ElemType dequeue(SeqQueue *s);//出队

代码:

// 出队操作

ElemType dequeue(SeqQueue *q) {

q->base[q->front++]=0;

q->size--;

    return 0;

}

该函数接受一个指向 SeqQueue 结构的指针 q。它将队列中的元素移除,实现了出队操作。这里的实现方式并不严格符合队列的操作规定,因为这个函数没有返回出队元素的值,而是直接返回了 0。正确的做法应该是在函数体内将出队元素的值返回。

具体来说,这个函数将队列中头元素(即下标为 front 的元素)置为 0,并将队列的 front 值加一表示头指针向后移动了一位。然后,它将队列中元素的数量 size 减一表示队列长度减少了一个元素。

这个函数用于从队列中移除元素,实现了队列的出队操作。调用这个函数可以将队列中的头元素移除。

ElemType getFront(SeqQueue *s); //获得队头元素

代码:

// 获取队列头元素

ElemType getFront(SeqQueue *q) {

    return q->base[q->front];

}

这个函数接受一个指向 SeqQueue 结构的指针 q。它返回队列头部元素的值,即队列中下标为 front 的位置上的元素。

通过调用这个函数,你可以获取到队列的头部元素,而不进行出队操作。这个函数不改变队列的状态,只返回队列头部元素的值。

ElemType getRear(SeqQueue *s); //获得队尾元素

代码:

// 获取队列尾元素

ElemType getRear(SeqQueue *q) {

    return q->base[q->rear-1];

}

这个函数接受一个指向 SeqQueue 结构的指针 q。它返回队列尾部元素的值,即队列中下标为 rear-1 的位置上的元素。

通过调用这个函数,你可以获取到队列的尾部元素,而不进行出队操作。这个函数不改变队列的状态,只返回队列尾部元素的值。

void destroyQueue(SeqQueue *s);//销毁队列

代码:

void destroyQueue(SeqQueue *q) {

    q->size=0;

    q->front=q->rear=0;

}

该函数接受一个指向 SeqQueue 结构的指针 q。它用于销毁队列,将队列恢复到初始状态。

具体来说,这个函数将队列中元素的数量 size、头指针 front 和尾指针 rear 都设置为 0,表示队列为空,没有任何元素。

通过调用这个函数,你可以销毁队列及其内部的数据结构,并释放相关的内存资源。注意,这段代码只是将队列状态重置,实际的内存释放工作可能需要在外部进行。

 

 完整代码:

main.c部分:

#include "SeqQueue.h"

int main()
{
 /*   SeqQueue q0; SeqQueue q1; SeqQueue q2;
    initQueue(&q0);initQueue(&q1);initQueue(&q2);*/
    SeqQueue q;
    initQueue(&q);
 if(isQueueFull(&q)){
    printf("队列已满!\n");
 }
 else printf("队列未满!\n");
 if(isQueueEmpty(&q)){
    printf("队列空\n");
 }
 else printf("队列不空\n");
    int n;
    printf("输入要入队的n个元素:\n");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int item;
        scanf("%d",&item);
        enqueue(&q, item);
    }
    printf("输入要出队的n个元素:\n");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        dequeue(&q);
    }
    printf("队头元素为:%d\n",getFront(&q));
    printf("队尾元素为:%d\n",getRear(&q));
    /*char k[101],l;
        gets(k);
    l=strlen(k);
    for(int i=0;i<l;i++)
    {
        if(k[i]=='{')
            {
                enqueue(&q0, k[i]);
            }
        else  if(k[i]=='(')
            {
                enqueue(&q1, k[i]);
            }
        else if(k[i]=='[')
            {
                enqueue(&q2, k[i]);
            }
        else if(!isQueueEmpty(&q0)&&k[i]=='}'){
            dequeue(&q0);
        }
        else if(!isQueueEmpty(&q1)&&k[i]==')'){
            dequeue(&q1);
        }
        else if(!isQueueEmpty(&q2)&&k[i]==']'){
            dequeue(&q2);
        }
        else if(isQueueEmpty(&q0)&&k[i]=='}'){
            printf("括号序列错误!\n");return 0;
        }
        else if(isQueueEmpty(&q1)&&k[i]==')'){
           printf("括号序列错误!\n");return 0;
        }
        else if(isQueueEmpty(&q2)&&k[i]==']'){
            printf("括号序列错误!\n");return 0;
        }
    }
    if(isQueueEmpty(&q0)&&isQueueEmpty(&q1)&&isQueueEmpty(&q2))
    {
        printf("括号序列正确!\n");
    }
    else {
        printf("括号序列错误!\n");
    }
    destroyQueue(&q0);destroyQueue(&q1);destroyQueue(&q2);*/
    return 0;
}

 SeqQueue.c部分

#include "SeqQueue.h"

// 初始化队列
void initQueue(SeqQueue *q) {
    q->base=(QElemType *)malloc(sizeof(QElemType)*MAXSIZE);
    q->front=q->rear=0;
    q->size=0;
}

// 判断队列是否已满
bool isQueueFull(SeqQueue *q) {
    if(q->size==MAXSIZE){
        return true;
    }
    else return false;
}

// 判断队列是否为空
bool isQueueEmpty(SeqQueue *q) {
    if(q->size==0){
        return true;
    }
    else return false;
}

// 入队操作
void enqueue(SeqQueue *q, QElemType item) {
    q->base[q->rear++]=item;
    q->size++;
}

// 出队操作
QElemType dequeue(SeqQueue *q) {
    q->base[q->front++]=0;
    q->size--;
    return 0;
}

// 获取队列头元素
QElemType getFront(SeqQueue *q) {
    return q->base[q->front];
}

// 获取队列尾元素
QElemType getRear(SeqQueue *q) {
    return q->base[q->rear-1];
}

void destroyQueue(SeqQueue *q) {
    q->size=0;
    q->front=q->rear=0;
}

SeqQueue.h部分

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

typedef char QElemType;//定义栈中元素类型
#define MAXSIZE 100 //定义顺序栈初始存储空间大小

typedef struct SeqQueue  //定义栈结构
{
    QElemType *base; //顺序栈存储空间基地址
    int front;  // 队列头
    int rear;  // 队列尾
    int size;  // 队列中元素数量
} SeqQueue;

void initQueue(SeqQueue *s);//初始化队列
bool isQueueFull(SeqQueue *s);//判断队列是否已满
bool isQueueEmpty(SeqQueue *s);//判断队列是否为空
void enqueue(SeqQueue *s,QElemType x);//入队
QElemType dequeue(SeqQueue *s);//出队
QElemType getFront(SeqQueue *s); //获得队头元素
QElemType getRear(SeqQueue *s); //获得队尾元素
void destroyQueue(SeqQueue *s);//销毁队列

感谢大家观看,有疑问评论区留言哈,感谢大家动动小手点个赞哦!!!

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是常见数据结构操作的代码示例: ## 数组操作 ### 初始化数组 ```python arr = [0] * n ``` ### 遍历数组 ```python for i in range(n): print(arr[i]) ``` ### 查找元素 ```python if x in arr: print("元素 x 存在") else: print("元素 x 不存在") ``` ### 插入元素 ```python arr.append(x) ``` ### 删除元素 ```python arr.remove(x) ``` ### 数组排序 ```python arr.sort() ``` ## 链表操作 ### 定义链表节点类 ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` ### 遍历链表 ```python cur = head while cur: print(cur.val) cur = cur.next ``` ### 查找元素 ```python cur = head while cur: if cur.val == x: print("元素 x 存在") break cur = cur.next else: print("元素 x 不存在") ``` ### 插入元素 ```python new_node = ListNode(x) new_node.next = head head = new_node ``` ### 删除元素 ```python if head.val == x: head = head.next else: cur = head while cur.next: if cur.next.val == x: cur.next = cur.next.next break cur = cur.next ``` ## 栈操作 ### 定义栈类 ```python class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def peek(self): if not self.is_empty(): return self.items[-1] def size(self): return len(self.items) ``` ### 入栈 ```python stack.push(x) ``` ### 出栈 ```python stack.pop() ``` ### 查看栈顶元素 ```python stack.peek() ``` ### 判断是否为空 ```python stack.is_empty() ``` ## 队列操作 ### 定义队列类 ```python class Queue: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def enqueue(self, item): self.items.append(item) def dequeue(self): if not self.is_empty(): return self.items.pop(0) def size(self): return len(self.items) ``` ### 入队 ```python queue.enqueue(x) ``` ### 出队 ```python queue.dequeue() ``` ### 判断队列是否为空 ```python queue.is_empty() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善程序员文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值