队列之顺序队列

又是美好的一天哈,继续码代码~~

本文介绍了顺序队列的实现,与我之前写的博客《栈之顺序栈》代码大体相同。不同的地方是,入队是从队尾开始,而入栈是从栈顶开始,故队列多了一个队尾指针。这里要注意的是,队首指针始终指向队头元素,而队尾指针始终指向对头元素的后一位。

#include<cstdio>
#define QueueSize 100             //假定预分配的顺序队列空间最多为100个元素

typedef char Datatype;            //假定顺序队列元素的数据类型为字符
typedef struct {
    Datatype data[QueueSize];
    int front;
    int rear;
}SeqQueue;

//********************************顺序队列的一些基本操作**********************************

void InitQueue(SeqQueue *Q){
    //将顺序顺序队列置空
    Q->front=Q->rear=0;
}

int QueueEmpty(SeqQueue *Q){
    //判断顺序顺序队列是否为空,若为空,则返回真,否则返回假
    return Q->front==Q->rear;
}

int QueueFull(SeqQueue *Q){
    //判断顺序队列是否满了,若满了则返回真,否则返回假
    return (!QueueEmpty(Q)&&Q->rear==QueueSize-2);
}

void EnQueue(SeqQueue *Q,Datatype x){
    //进顺序队列操作
    if(QueueFull(Q)){
        printf("Queue overflow\n");    //上溢,退出运行
        return ;
    }
    Q->data[Q->rear]=x;                //将新元素插入队尾
    Q->rear++;                         //将队尾指针加1
}

void DeQueue(SeqQueue *Q){
    //出顺序队列操作
    if(QueueEmpty(Q)){
        printf("Queue underflow\n");    //下溢,退出运行
        return ;
    }
    Q->front++;                         //将队头指针加1
}

Datatype QueueFront(SeqQueue *Q){
    //取顺序队列顶元素
    if(QueueEmpty(Q)){                  //顺序队列空则无法取顺序队列队首元素
        printf("Queue is empty!\n");
        return '?';
    }
    return Q->data[Q->front];
}

void CreateQueue(SeqQueue *Q){
    //建立一个顺序队列
    char ch;
    while((ch=getchar())!='\n'){
        EnQueue(Q,ch);
    }
    return ;
}

//***********************************测试函数********************************

int main(){
    SeqQueue *Q;
    InitQueue(Q);
    printf("输入一个字符串,来建立一个字符串顺序队列:\n");
    CreateQueue(Q);
    printf("顺序队列已建好!\n");
    printf("顺序队列队头元素是:%c\n",QueueFront(Q));
    printf("弹出顺序队列队头元素:\n");
    DeQueue(Q);
    printf("此时顺序队列队头元素为:%c\n",QueueFront(Q));
    printf("将元素‘z’入队:\n");
    EnQueue(Q,'z');
    printf("此时队头元素是:%c\n",QueueFront(Q));
    return 0;
}

测试样例:


与顺序栈的实现相同,由于其结构的顺序特征,从而可以用数组来模拟顺序队列,具体代码与我的博客《栈之顺序栈》中的类似,这里就不再贴出了,有需要的可以查看那篇文章。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值