【C语言】队列

C语言队列练习:输入N组队列操作序列,每组以S开始X结束。输出每组操作后的队列元素。
input:
2
S
E 0
E 1
X
S
E 0
E 1
D
X
Output:
01
1

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAX 1024
struct Link
{
    int data;
    struct Link* next;
};

struct Queue
{
    struct Link* front;
    struct Link* rear;
    int size;
};

void QueueInit(struct Queue* queue)
{
    queue->front = NULL;
    queue->rear = NULL;
    queue->size = 0;
}

int QueueEmpty(struct Queue* queue)
{
    return (queue->size == 0);
}

void QueuePush(struct Queue* queue, int data)
{
    struct Link* node;
    node = (struct Link*)malloc(sizeof(struct Link));
    assert(node != NULL);

    node->data = data;
    node->next = NULL;

    if (QueueEmpty(queue))
    {
        queue->front = node;
        queue->rear = node;
    }
    else
    {
        queue->rear->next = node;
        queue->rear = node;
    }
    ++queue->size;
}

int QueuePop(struct Queue* queue, int* data)
{
    if (QueueEmpty(queue))
    {
        return 0;
    }
    struct Link* tmp = queue->front;
    *data = queue->front->data;
    queue->front = queue->front->next;
    free(tmp);
    --queue->size;

    return 1;
}

void QueueDestroy(struct Queue* queue)
{
    struct Link* tmp;
    while (queue->front)
    {
        tmp = queue->front;
        queue->front = queue->front->next;
        free(tmp);
    }
}

int main(void)
{

    int N, cnt = 0, j = 0;
    
    scanf_s("%d", &N);
    getchar();
    char input_str[MAX];
    char str[MAX][MAX] = {'0'};
    while (1)
    {
        gets_s(input_str);
        strcat_s(str[cnt], input_str);
        if (input_str[0] == 'X')
        {
            cnt++;
        }
        j++;
        if (cnt >= N)
        {
            break;
        }
    }
    struct Queue queue;
    QueueInit(&queue);
    int non = 0;
    for (int i = 0; i < N; ++i)
    {
        for (int k = 0 ; k < MAX ; k++)
        {
            if (str[i][k] == 'E')
            {
                int tmp = str[i][k + 2] - '0';
                QueuePush(&queue, tmp);
            }
            if (str[i][k] == 'D' && !QueueEmpty(&queue))
            {
                QueuePop(&queue, &non);
            }
            if (str[i][k] == 'X') {
                int s;
                while (!QueueEmpty(&queue))
                {
                    QueuePop(&queue, &s);
                    printf("%d ", s);
                }
                printf("\n");
                QueueInit(&queue);
                break;
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值