队列的实现(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int DataType;
typedef struct{
    // 环形队列元素存储空间基质
    DataType *data;
    // 环形队列头尾
    int front,rear;
}SeqQueue;    //环形队列类型

int go_on(){
    int flag=1,i;
    char choice;
    while (1) {
        printf("继续请输入1,停止请输入0\n");
        scanf("%d",&i);
        if (i==1) {
        break;
        }
        else if (i==0) {
        flag=0;
        break;
        }
        else {
        printf("请按要求输入,谢谢\n");
        }
    }
    return (flag);
}

// 初始化运算,构造一个空环状队列
int Init_SeqQueue(SeqQueue *Q,int n){
    Q->data=(DataType *)malloc(n*sizeof(DataType));
    if (Q->data==NULL) {
        printf("\n内存分配失败\n");
        exit(-1);
    }
    Q->front=Q->rear=0;
}
// 判断队空运算
int Empty_SeqQueue(SeqQueue *Q){
    if (Q->front==Q->rear) {
        return 1;
    }
    else {
        return 0 ;
    }
}
// 判断队满运算
int Full_SeqQueue(SeqQueue *Q){
    if ((Q->rear+1)%MAXSIZE==Q->front) {
        return 1;
    }else {
        return 0;
    }
}
// 求队长运算
int Length_SeqQueue(SeqQueue *Q){
    int k;
    k=(Q->rear-Q->front+MAXSIZE)%MAXSIZE;
    return k;
}
void Length(SeqQueue *Q){
    int k;
    k=Length_SeqQueue(Q);
    printf("\n队长:%d\n",k);
}
// 入队运算,插入元素e为新的队头元素
int EnQueue_SeqQueue(SeqQueue *Q,DataType e){
    if (Full_SeqQueue(Q)==1) {
        printf("队满不能入队\n");
        return 0;
    }else {
        Q->data[Q->rear]=e;
        Q->rear=(Q->rear+1)%MAXSIZE;
        return 1;
    }
}
void EnQueue(SeqQueue *Q){
    DataType x;
    int flag=1,enqueue_flag;
    while (flag) {
        printf("\n请输入要入队的元素:\n");
        scanf("%d",&x);
        enqueue_flag=EnQueue_SeqQueue(Q,x);
        if (enqueue_flag==1) {
            printf("\n入队成功\n");
        }else {
             printf("\n入队失败\n");
        }
        flag=go_on();
    }
}
// 出队运算,出队,删除队头元素。并由*e返回其值
int DeQueue_SeqQueue(SeqQueue *Q,DataType *e){
    if (Empty_SeqQueue(Q)) {
        printf("\n队空,不能出队\n");
        return 0;
    }else {
        *e=Q->data[Q->front];
        Q->front=(Q->front+1)%MAXSIZE;
        return 1;
    }
}
void DeQueue(SeqQueue *Q){
    DataType x ; 
    int flag=1,dequeue_flag;
    while (flag) {
        dequeue_flag=DeQueue_SeqQueue(Q, &x);
        if (dequeue_flag==1) {
            printf("\n出队成功,出队元素为:%d\n",x);
        }else {
            printf("出队失败");
        }
        flag=go_on();
    }

}
// 取队头运算
int GetFront_SeqQueue(SeqQueue *Q,DataType *e){
    if (Empty_SeqQueue(Q)) {
        printf("\n队空,不能取队头元素\n");
        return 0;
    }
    else {
        *e=Q->data[Q->front];
        return 1;
    }
}
void Display_Front(SeqQueue *Q){
    DataType e;
    if (Empty_SeqQueue(Q)==1) {
        printf("\n队空,没有元素\n");
    }else {
        GetFront_SeqQueue(Q, &e);
        printf("\n队头元素\n");
        printf("%4d\n",e);
        
    }
}
// 输出全部元素
void Display_SeqQueue(SeqQueue *Q){
    int k,len;
    if (Empty_SeqQueue(Q)==1) {
        printf("\n队空,没有元素\n");
    }else {
        printf("\n队头全部元素\n");
        printf("\n队头<---------------->队尾\n");
        len=Length_SeqQueue(Q);
        for(k=0;k<len;k++)
        printf("%4d",Q->data[(Q->front+k)%MAXSIZE]);
    }
}

main(){
    SeqQueue Q;
    int flag=1,j;
    Init_SeqQueue(&Q,MAXSIZE);
    do {
        printf("\n");
        printf("-------循环队列的实现---------\n");
        printf("入队请摇1\n");
        printf("出队请摇2\n");
        printf("输出队长请摇3\n");
        printf("输出队头元素请摇4\n");
        printf("输出全部元素请摇5\n");
        printf("退出请摇0\n");
        printf("----------------------\n");
        scanf("%d",&j);
        switch (j) {
        case 1:EnQueue(&Q);break;
        case 2:DeQueue(&Q);break;
        case 3:Length(&Q);break;
        case 4:Display_Front(&Q);break;
        case 5:Display_SeqQueue(&Q);break;
        case 0:flag=0;printf("感谢大哥的使用\n");break;
        }
    }while (flag==1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链队列实现可以使用C语言中的链表来实现,具体实现如下: ``` #include <stdio.h> #include <stdlib.h> // 定义队列结构体 typedef struct QueueNode { int data; struct QueueNode* next; } QueueNode; // 定义队列 typedef struct { QueueNode* front; // 队头指针 QueueNode* rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue* queue) { queue->front = NULL; queue->rear = NULL; } // 判断队列是否为空 int isQueueEmpty(Queue* queue) { return queue->front == NULL; } // 入队 void enqueue(Queue* queue, int data) { QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode)); node->data = data; node->next = NULL; if (queue->rear == NULL) { queue->front = node; queue->rear = node; } else { queue->rear->next = node; queue->rear = node; } } // 出队 int dequeue(Queue* queue) { if (isQueueEmpty(queue)) { printf("Error: Queue is empty.\n"); exit(1); } int data = queue->front->data; QueueNode* temp = queue->front; queue->front = queue->front->next; if (queue->front == NULL) { queue->rear = NULL; } free(temp); return data; } // 打印队列 void printQueue(Queue* queue) { printf("Queue: "); QueueNode* node = queue->front; while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } // 测试队列 int main() { Queue queue; initQueue(&queue); enqueue(&queue, 1); enqueue(&queue, 2); enqueue(&queue, 3); printQueue(&queue); dequeue(&queue); printQueue(&queue); dequeue(&queue); printQueue(&queue); dequeue(&queue); printQueue(&queue); dequeue(&queue); // Error: Queue is empty. return 0; } ``` 上述代码实现了单链队列的基本操作,包括初始化队列、判断队列是否为空、入队、出队、打印队列等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值