• "双队列"学习


    image

    image

    image

    1.输入限制性双队列:

    代码:InLimitDeQueue.c

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct _queue
    {
    	int data;
    	struct _queue *next;
    }QUEUE;
    
    QUEUE * rear = NULL;
    QUEUE * front = NULL;
    
    //输入限制型双队列
    int InQueue(int value)
    {
    	QUEUE * q = (QUEUE *)malloc(sizeof(QUEUE));
    	if(q == NULL) return 0;
    	q->data = value;
    	q->next = NULL;
    	if(front == NULL)
    		front = q;
    	else
    		rear->next = q;
    	rear = q;
    	return 1;
    }
    
    int OutQueueByFront(int *value)
    {
    	QUEUE * p = NULL;
    	if(front == NULL)
    		return 0;
    	p = front;
    	front = front->next;
    	*value = p->data;
    	free(p);
    	return 1;
    }
    
    int OutQueueByRear(int *value)
    {
    	QUEUE *p = NULL;
    	if(rear == NULL)
    		return 0;
    	//只有一个数据
    	if(rear == front)
    	{
    		*value = rear->data;
    		free(rear);
    		rear = NULL;
    		front = NULL;
    	}else{
    		p = front;
    		//使p指向最后一个的前面一个
    		while(p->next != rear)
    			p = p->next;
    		*value = rear->data;
    		free(rear);
    		rear = p;
    		rear->next = NULL;
    	}
    	return 1;
    }
    
    void main()
    {
    	int res,i,arr[5] = {1,2,3,4,5};
    	for(i = 0;i<5;i++)
    		InQueue(arr[i]);
    	while(1)
    	{
    		printf("1.从队头取出;2.从队尾取出;3.退出:");
    		scanf("%d",&res);
    		//清空输入缓冲区
    		fflush(stdin);
    		if(res == 1)
    		{
    			if(OutQueueByFront(&res) == 1)
    				printf("取出的值为:%d\n",res);
    			else
    				printf("队列为空!\n");
    
    		}else if(res == 2)
    		{
    			if(OutQueueByRear(&res) == 1)
    				printf("取出的值为:%d\n",res);
    			else
    				printf("队列为空!\n");
    		}else if(res == 3)
    		{
    			exit(0);
    		}
    	}
    }

    运行效果:

    存入队列的元素为1,2,3,4,5

    image

    2.输出限制性双队列:

    代码:OutLimitDeQueue.c

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct _queue
    {
    	int data;
    	struct _queue *next;
    }QUEUE;
    
    QUEUE * rear = NULL;
    QUEUE * front = NULL;
    
    //输出限制型双队列
    int OutQueue(int *value)
    {
    	QUEUE *p = NULL;
    	if(front == NULL)
    		return 0;
    	p = front;
    	front = front->next;
    	*value = p->data;
    	free(p);
    	return 1;
    }
    
    int InQueueByRear(int value)
    {
    	QUEUE *q = (QUEUE *)malloc(sizeof(QUEUE));
    	if(q == NULL) return 0;
    	q->data = value;
    	q->next = NULL;
    	if(rear == NULL)
    		front = q;
    	else 
    		rear->next = q;
    	rear = q;
    	return 1;
    }
    
    int InQueueByFront(int value)
    {
    	QUEUE *q = (QUEUE *)malloc(sizeof(QUEUE));
    	if(q == NULL)return 0;
    	q->data = value;
    	q->next = front;
    	front = q;
    	if(rear == NULL)
    		rear = q;
    	return 1;
    }
    
    
    void PrintQueue()
    {
    	QUEUE *p = front;
    	while(p)
    	{
    		printf("%5d",p->data);
    		p = p->next;
    	}
    	printf("\n");
    }
    
    void main()
    {
    	int res;
    	while(1)
    	{
    		printf("1.从队头存入;2.从队尾存入;3.退出");
    		scanf("%d",&res);
    		fflush(stdin);
    		if(res == 1)
    		{
    			printf("请输入要存入的值:");
    			scanf("%d",&res);
    			fflush(stdin);
    			if(InQueueByFront(res))
    			{
    				PrintQueue();
    			}else
    				printf("存入失败\n");
    		}else if(res == 2)
    		{
    			printf("请输入要存入的值:");
    			scanf("%d",&res);
    			fflush(stdin);
    			if(InQueueByRear(res))
    			{
    				PrintQueue();
    			}else
    				printf("存入失败\n");
    		}else if(res == 3)
    			break;
    	}
    }

    运行效果:

    image

  • 相关阅读:
    使用Zabbix服务端本地邮箱账号发送报警邮件及指定报警邮件操作记录
    分布式监控系统Zabbix--完整安装记录 -添加web页面监控
    如何为你的代码选择一个开源协议
    Android多开/分身检测
    squid介绍及其简单配置
    PS 切图、抠图
    AxureRP8实战手册
    墨刀 vs Axure RP
    Android 插件化 开发
    《Photoshop智能手机APP界面设计》学习笔记-转
  • 原文地址:https://www.cnblogs.com/shenerguang/p/2333996.html
Copyright © 2020-2023  润新知