1. 程式人生 > >【資料結構】順序佇列的實現(C語言)

【資料結構】順序佇列的實現(C語言)

佇列的基本概念及其描述

佇列是一種特殊的線性表,它的特殊性在於佇列的插入和刪除操作分別在表的兩端進行。

插入的那一端稱為隊尾,刪除的那一端稱為隊首。佇列的插入操作和刪除操作分別稱為進隊出隊

先進先出(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;
}