【数据结构】顺序队列的实现(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/82756017

队列的基本概念及其描述

队列是一种特殊的线性表,它的特殊性在于队列的插入和删除操作分别在表的两端进行。

插入的那一端称为队尾,删除的那一端称为队首。队列的插入操作和删除操作分别称为进队出队

先进先出(First In First Out)

顺序队列要掌握以下操作:

1、队列的初始化

2、判断队列是否为空

3、打印队列的节点值

4、取得队列的队首节点值

5、队列的插入操作(从队尾插入)

6、队列的删除操作(从队首删除)

运行环境:Code::Blocks 17.12

下面是头文件

#ifndef SEQQUEUE_H_INCLUDED
#define SEQQUEUE_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
    datatype a[MAXSIZE];
    int front_;
    int rear_;
}sequence_queue;

//队列(顺序存储)初始化
void init(sequence_queue *sq)
{
    sq->front_=0;
    sq->rear_=0;
}

//判断队列(顺序存储)是否为空
int isempty(sequence_queue sq)
{
    return (sq.front_==sq.rear_?1:0);
    //是空的话返回1
}

//打印队列的节点值
void display(sequence_queue sq)
{
    int i;
    if (isempty(sq))
    {
        printf("\n该队列是空的!\n\n");
    }
    else
    {
        for(i=sq.front_;i<sq.rear_;i++)
        {
            printf("%5d",sq.a[i]);
        }
    }
}

//取得队列(顺序储存)的队首节点值
datatype get(sequence_queue sq)
{
    if(isempty(sq))
    {
        printf("\n该队列是空的,无法获得队首节点值。\n\n");exit(1);
    }
    return sq.a[sq.front_];
}

//队列(顺序储存)的插入操作
void insert_(sequence_queue *sq,datatype x)
{
    if(sq->rear_==MAXSIZE)
    {
        printf("\n该队列是满的\n");
    }
    else
    {
        sq->a[sq->rear_]=x;
        sq->rear_++;
        printf("\n插入成功!\n\n");
    }
}

//队列(顺序储存)的删除操作
void del(sequence_queue *sq)
{
    if(sq->front_==sq->rear_)
    {
        printf("\n该队列是空的不能进行删除操作!\n\n");
    }
    else
    {
        sq->front_++;
        printf("删除成功!\n\n");
    }
}

void menu()
{
    printf("\t|===================================|\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|        顺序队列及其实现           |\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|有如下选项:                        |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|【1】队列的初始化                  |\t\n");
    printf("\t|【2】判断队列是否为空              |\t\n");
    printf("\t|【3】打印队列的节点值              |\t\n");
    printf("\t|【4】取得队列的队首节点值          |\t\n");
    printf("\t|【5】队列的插入操作                |\t\n");
    printf("\t|【6】队列的删除操作                |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|Ctrl+C结束该程序!!!             |\t\n");
    printf("\t|===================================|\t\n");
}
#endif // SEQQUEUE_H_INCLUDED

下面是主程序

#include <stdio.h>
#include "seqqueue.h"
int main ()
{
    int a,i,k;
    sequence_queue sq;
    init(&sq);
    while(1)
    {
        menu();
        printf("请输入你的选择:");
        scanf("%d",&a);
        switch(a)
        {
            case 1:
            {
                init(&sq);
                printf("已成功初始化一个队列!\n\n");
                break;
            }
            case 2:
            {
                if(isempty(sq))
                {
                    printf("该队列为空!\n\n");
                }
                else
                {
                    printf("该队列不为空!\n\n");
                }
                break;
            }
            case 3:
            {
                display(sq);
                printf("\n已成功打印队列的节点值!\n\n");
                break;
            }
            case 4:
            {
                printf("%d",get(sq));
                break;
            }
            case 5:
            {
                printf("请输入一个想要插入的数:");
                scanf("%d",&a);
                insert_(&sq,a);
                break;
            }
            case 6:
            {
                del(&sq);
                break;
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/82756017