数据结构-第三章-循环顺序队-增设标记法实现各种基本功能

简介: 数据结构-第三章-循环顺序队-增设标记法实现各种基本功能

数据结构-第三章-循环顺序队-增设标记法实现各种基本功能

**文件名后缀应为.cpp
文件名后缀应为.cpp
文件名后缀应为.cpp**

在循环队列的基础上增设标记tag成员变量
入队成功tag=1
出队成功tag=0

**该方法是区分队空队满以下三种方法中的第三种 (详见王道书)
方法一:牺牲一个单元来区分队空队满。(易,但浪费空间)
方法二:数据结构中增设表示元素个数的数据成员。(易)
方法二:数据结构中增设表示元素个数的数据成员。(与二一样,但这种就更巧妙一点,这种思想更重要,对其他算法有非常大的帮助)**

详细注释以后再更新
-------------------------------------------------------------------------------------------------------------------------

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MaxSize 20
#define ElemType int

typedef struct {
    ElemType data[MaxSize];
    int front, rear, tag;
} SqQueue;

void InitQueue( SqQueue &Q );                //定义 初始化顺序队 函数
bool QueueEmpty( SqQueue Q );                //定义 判断顺序队空 函数
bool QueueFull( SqQueue Q );                //定义 判断顺序队满 函数
int QueueLength( SqQueue Q );                //定义 返回队的长度 函数
bool EnQueue( SqQueue &Q, ElemType x );        //定义 入队 函数
bool DeQueue( SqQueue &Q, ElemType &x );    //定义 出队 函数
bool GetHead( SqQueue Q, ElemType &x );        //定义 获取队头元素 函数
bool ClearQueue( SqQueue &Q );                //定义 清空顺序队 函数

void PrintQueue( SqQueue Q );
int main() {

    srand( ( unsigned )time( NULL ) );

    SqQueue Q;//定义一个顺序队
    InitQueue( Q );//初始化顺序队
    printf( "\n入队前:\n" );
    printf( "空结果:%d\n", QueueEmpty( Q ) );
    printf( "满结果:%d\n", QueueFull( Q ) );

//    测试入队函数
    for( int i = 0; i < 20; i++ ) {
        EnQueue( Q, i );
    }
    PrintQueue( Q );

    printf( "\n入队后及出队前:\n" );
    printf( "空结果:%d\n", QueueEmpty( Q ) );
    printf( "满结果:%d\n", QueueFull( Q ) );


    //测试 弹出队函数
    printf( "出队元素依次为:\n" );
    for( int i = 0; i < 19; i++ ) {
        int x;
        DeQueue( Q, x );
        printf( "%d ", x );
    }
    printf( "\n" );
    PrintQueue( Q );

    printf( "\n出队后:\n" );
    printf( "空结果:%d\n", QueueEmpty( Q ) );
    printf( "满结果:%d\n", QueueFull( Q ) );

    //测试读取队头元素函数
    int x;
    if( GetHead( Q, x ) ) {
        printf( "Q.data[Q.front]= %d \n", x );
    } else {
        printf( "队空,读取失败!\n" );
    }

    //测试清空队函数
    ClearQueue( Q );
    PrintQueue( Q );

    return 0;
}

//实现 初始化顺序队 函数
void InitQueue( SqQueue &Q ) {
    Q.front = Q.rear = Q.tag = 0;
}

//实现 判断顺序队空 函数
bool QueueEmpty( SqQueue Q ) {
    if( Q.front == Q.rear && Q.tag == 0 )
        return true;
    else
        return false;
}

//实现 判断顺序队满 函数
bool QueueFull( SqQueue Q ) {
    if( Q.front == Q.rear && Q.tag == 1 )
        return true;
    else
        return false;
}

//实现 返回队的长度 函数
int QueueLength( SqQueue Q ) {
    int len = ( Q.rear - Q.front + MaxSize  ) % MaxSize;
    if( len == 0 && Q.tag == 0 ) {
        return 0;
    }
    if( len == 0 && Q.tag == 1 ) {
        return MaxSize;
    }
    return len;
}

//实现 入队 函数
bool EnQueue( SqQueue &Q, ElemType x ) {
    if( QueueFull( Q ) )    //判断队是否满,若满则入队失败,返回false
        return false;

    Q.data[Q.rear] = x;
    Q.rear = ( Q.rear + 1 ) % MaxSize;
    Q.tag = 1;

    return true;
}

//实现 出队 函数
bool DeQueue( SqQueue &Q, ElemType &x ) {
    if( QueueEmpty( Q ) )
        return false;

    x = Q.data[Q.front];
    Q.front = ( Q.front + 1 ) % MaxSize;
    Q.tag = 0;

    return true;
}

//实现 获取队头元素 函数
bool GetHead( SqQueue Q, ElemType &x ) {
    if( QueueEmpty( Q ) )
        return false;
    x = Q.data[Q.front];

    return true;
}

//实现 清空顺序队 函数
bool ClearQueue( SqQueue &Q ) {
    Q.front = Q.rear = Q.tag = 0;
    return true;
}

void PrintQueue( SqQueue Q ) {
    if( QueueEmpty( Q ) ) {
        printf( "\n队空\n" );
        return;
    }

    printf( "当前队列元素为:\n" );
    int i = Q.front;
    while( 1 ) {
        printf( "%d ", Q.data[i] );
        i = ( i + 1 ) % MaxSize;
        if( i == Q.rear )break;
    }

    printf( "\n共%d个元素\n", QueueLength( Q ) );
}
目录
相关文章
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
3月前
【数据结构】二叉搜索树的功能实现详解
【数据结构】二叉搜索树的功能实现详解
37 0
|
6月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
205 1
|
7月前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
511 1
|
8月前
|
C++
数据结构(循环单链表
数据结构(循环单链表
36 2
|
算法
【数据结构与算法】two X 树的遍历以及功能实现(下)
【数据结构与算法】two X 树的遍历以及功能实现(下)
|
8月前
|
存储
【栈】基于顺序表的栈功能实现
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
43 0
|
8月前
|
存储
【数据结构】【版本1.2】【线性时代】——链表之王(双向带头循环)
【数据结构】【版本1.2】【线性时代】——链表之王(双向带头循环)
|
8月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
177 3
|
JavaScript 前端开发
数据结构之栈-JavaScript实现栈的功能
数据结构之栈-JavaScript实现栈的功能
42 0