数据结构---4.队列的应用

数据结构—4.队列的应用

一、应用1

  1. 解码,对于一串数字,将第一个数字删除,第二个数字排至这串数字的末尾,将第三个数字删除,将第四个数字排至末尾,循环下去直到这串数字都删除了。删除的数字就是真正的密码。举个例子:

image-20211127213419273
2. 代码实现

/*
 * @name 队列的应用
 * @Date 2021年11月23日
 * @Author 机器人工程师sgk
*/

#include <stdio.h>
#include <string.h>

#define SIZE 512

char queue[SIZE];
int head, tail = 0;//队列的两个关键要素,头和尾。

void enqueue(char c);
char dequeue(void);
int is_empty(void);
int is_full(void);

int main(void)
{
        char code[12];
        int n;
        int i = 0;
        char num;

        printf("Please en a code:\n");
        gets(code);

        for(n = 0; n < strlen(code); n++)
        {
                if(!is_full())
                {
                        enqueue(code[n]);//入队列
                }
        }

        while(!is_empty())//当不为空的时候,
        {
                code[i++] = dequeue();//出队列,放在code里面,第一次执行,将第一个元素放入code[]数组。牢记出队列的特点。
                if(!is_empty())
                {
                        num = dequeue();//第二次出队列,暂存在num里,
                        if(!is_full())
                                enqueue(num);//放在队列的最后,
                }
        //直到队列为空。
        }

        printf("Origral code is :\n");
        for(n = 0; n < strlen(code); n++)
                printf("%c", code[n]);
        printf("\n");

}

/*
 * @name enqueue
 * @brief 入队列。
 * @param char 型数据
 * @retval None
*/
void enqueue(char c)
{
        queue[tail] = c;//不断有元素入队列,表现形式是队列的尾在不断增加。
        tail = (tail + 1) % SIZE;
}

/*
 * @name dequeue
 * @brief 出队列
 * @param None
 * @retval char 型数据。
*/
char dequeue(void)
{
        char ch;

       ch = queue[head];
        head = (head + 1) % SIZE;

        return ch;//出队列,队列的头不断增加。
}

/*
 * @name is_empty 
 * @brief 判断队列是否为空。
 * @param None
 * @retval int型数据类型
*/
int is_empty(void)
{
        return head == tail;
}

/*
 * @name is_full 
 * @brief 判断队列是否存满了。
 * @param None
 * @retval int型数据类型
*/
int is_full(void)
{
        return ((tail + 1) % SIZE) == head;
}

运行结果:

Please en a code:
765730314892
Origral code is :
753349608721
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值