数据结构--线性队列

对于线性队列的练习


/*
 * Description: 队列的顺序存储方式的练习
 *              主要是关于队列的基本的操作
 *              包括初始化队列、判空队列、入队、出对
 *              读对头元素以及读队中的所有的元素
 *              本次练习采用的是 队尾指针指向队尾元素的下一个位置
 * Author:qichaoqun
 * Date:2019/08/09
 * */
#include "stdio.h"
#include "stdlib.h"

#define MAX_SIZE 20
typedef int ElemType;

/**
 * 定义队列
 * 主要是包括队列的数据段
 * 队列的头指针和尾指针
 */
typedef struct {
    //定义队列的数据段
    // 用于存放进入队列的数值
    ElemType data[MAX_SIZE];
    //定义队列的头和尾指针
    int head,rear;
}SqQueue;

void showMenu();

bool initQueue(SqQueue &sqQueue);

bool isEmptyQueue(SqQueue &sqQueue);

bool enQueue(SqQueue &sqQueue,int value);

bool outQueue(SqQueue &sqQueue,int &outValue);

int getHeadValue(SqQueue &sqQueue);

void getValues(SqQueue &sqQueue);

int main(){
    bool isExit = false;

    //定义队列
    SqQueue sqQueue;

    while (!isExit){
        showMenu();
        int option;
        scanf("%d",&option);
        switch (option){
            case 1:
                //初始化队列
                if(initQueue(sqQueue)){
                    printf("初始化成功\n");
                }
                break;
            case 2:
                //判断队列是否为空
                if(isEmptyQueue(sqQueue)){
                    printf("队列为空\n");
                }else{
                    printf("队列不为空\n");
                }
                break;
            case 3:
                //入队
                printf("请输入要入队的元素");
                int value;
                scanf("%d",&value);
                if(enQueue(sqQueue,value)){
                    printf("入队成功\n");
                }else{
                    printf("入队失败\n");
                }
                break;
            case 4:
                //出队
                int outValue;
                if(outQueue(sqQueue,outValue)){
                    printf("出队成功,出队的元素为 %d\n",outValue);
                }else{
                    printf("出队失败\n");
                }
                break;
            case 5:{
                //获取队头元素
                int headValue = getHeadValue(sqQueue);
                if(headValue != -65535){
                    printf("队头的元素为 %d\n",headValue);
                }else{
                    printf("队头元素获取失败\n");
                }
                break;
            }
            case 6:
                //获取队中的所有的元素
                getValues(sqQueue);
                break;
            case 7:
                isExit = true;
                break;
            default:
                printf("输入错误请重新输入\n");
                break;
        }

    }
}

/**
 * 获取队中的所有的元素
 */
 void getValues(SqQueue &sqQueue){
     if(!isEmptyQueue(sqQueue)){
         //不为空
         int front = sqQueue.head;
         printf("队中的元素为 ");
         for (int i = front; i < sqQueue.rear; ++i) {
             printf(" %d",sqQueue.data[i]);
         }
         printf("\n");
     } else{
         printf("队列为空\n");
     }
 }

/**
 * 获取对头的元素
 */
 int getHeadValue(SqQueue &sqQueue){
     if(!isEmptyQueue(sqQueue)){
         //不为空
         return sqQueue.data[sqQueue.head];
     }
     return -65535;
 }

/**
 * 出队
 * 值得注意的是,在进行出对操作时同样的需要对队列进行判断
 * 当队列为空的时候则不能进行出对操作
 * 当且仅当队列不为空的时候进行出对的操作
 */
 bool outQueue(SqQueue &sqQueue,int &outValue){
     if(sqQueue.head == sqQueue.rear){
         //队列为空则不能进行出对的操作
         return false;
     }
     //队列不为空,则可以进行出对的操作
     outValue = sqQueue.head;
     sqQueue.head++;
     return true;
 }

/**
 * 入队
 * 入队之前要判断队列是否满了
 * 如果队列满了则不能入队
 * 如果没有满则可以入队
 */
bool enQueue(SqQueue &sqQueue,int value){
    if(sqQueue.rear < MAX_SIZE){
        //没有满,则进行入队操作
        sqQueue.data[sqQueue.rear] = value;
        sqQueue.rear++;
        return true;
    }
    return false;
}



/**
 * 判断队列是否为空
 * 顺序队列 采用小于最大长度的方式可能会产生假溢出
 * 这也就是循环队列产生的原因
 */
 bool isEmptyQueue(SqQueue &sqQueue){
     if(sqQueue.rear == sqQueue.head){
         return true;
     }
     return false;
 }


/**
 * 初始化队列
 */
 bool initQueue(SqQueue &sqQueue){
     sqQueue.head = sqQueue.rear = 0;
     return true;
 }

void showMenu(){
    printf("    对于队列的顺序存储结构的操作\n");
    printf("1 初始化队列\n");
    printf("2 判断队列是否为空\n");
    printf("3 入队\n");
    printf("4 出队\n");
    printf("5 获取对头元素\n");
    printf("6 获取队列中的所有的元素\n");
    printf("请输入你的选择 ");
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值