要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。

2023-05-16

用标志域表示队空队满状态的循环队列的综合操作(**)
描述:在这里插入代码片

要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。

(1)教材中为区分当队头与队尾指针相同时队列状态的空和满,以牺牲一个空间的代价来实现的,空:Q->front == Q->rear,满:(Q->rear+1)%MAXSIZE == Q->front。

(2)本题不损失一个空间,全部都得到利用,为此如下定义循环队列类型:

Typedef struct 

  { QueueElementType element[MAXSIZE];

    int front;

    int rear;

    int tag;

   }SeqQueue;

此时,循环队列空和满的条件分别为: Q->front == Q->rear&&tag == 0 和Q->front == Q->rear&&tag == 1

(3)编写入队函数、出队函数。

(4)在主函数中编写菜单(1.入队;2.出队;3.退出),调用上述功能函数。

代码如下:

#include<stdio.h>
#include<stdlib.h>

#define error 0
#define OK 1
#define FALSE -1
#define TRUE 1
#define scanf_s scanf
#define MAXSIZE 10
typedef int SeqQueueElemType;


typedef struct queue{
	SeqQueueElemType elem[MAXSIZE];
	int front;//头指针
	int rear;//尾指针
	int tag;//标志域
}SeqQueue; //定义队头

void Initqueue(SeqQueue *bt);
int EnterQueue(SeqQueue *bt,SeqQueueElemType x);
int DeleteQueue(SeqQueue *bt,SeqQueueElemType *x);
int printSeqQueue(SeqQueue *bt,int i);
int main();

void Initqueue(SeqQueue *Q)//循环队列初始化操作
{
	Q->front=Q->rear=0;   //初始化时,队列的头尾指针都指在下表为0处
	Q->tag=0;             //taq置0.表示对列为空
}
/*TODO:元素加入到队列
 功能描述:如果队头和队尾相等并且tag为1,提示队列已经满printf("操作提示:队已满!");并返回error
 不满的情况下,把元素加入到队列elem中,增加队尾值,打印提示元素已加入队列printf("操作提示:%d 已入队!",x);
 如果此时队头和队尾相等,则设置tag为1,表示队列已满
 参数说明:Q-SeqQueue型的队列指针变量
       x-SeqQueueElemType型的待加入到队列的元素
 返回值说明:成功返回TRUE 队列已满返回error
 */
int EnterQueue(SeqQueue *Q, SeqQueueElemType x)
{
    if(Q->front == Q->rear && Q->tag == 1)
    {
        printf("操作提示:队已满!");
        return error;
    }
    else
    {
        Q->elem[Q->rear] = x;
        Q->rear = (Q->rear+1) % MAXSIZE;//通过求模运算实现循环
        printf("操作提示:%d 已入队!",x);
        if(Q->front == Q->rear)  //如果此时队头和队尾相等,则设置tag为1,表示队列已满
        {
            Q->tag = 1;
        }
    }
}
/*TODO:元素出列
 功能描述:如果队头和队尾相等并且tag为0,提示队列已经空了printf("操作提示:队为空!");并返回error
 不空的情况下,把头部元素赋值给x,打印提示头部元素已出队列printf("操作提示:%d 已出队!",tmp);增加队头值
 如果此时队头和队尾相等,则设置tag为0,表示队列为空
 参数说明:Q-SeqQueue型的队列指针变量
       x-SeqQueueElemType型的出队元素指针
 返回值说明:成功返回TRUE 队列已空返回error
 */
int DeleteQueue(SeqQueue *Q, SeqQueueElemType *x)
{
    if(Q->front == Q->rear && Q->tag == 0)
    {
        printf("操作提示:队为空!");
        return error;
    }
    else
    {
        *x = Q->elem[Q->front];
        Q->front = (Q->front+1) % MAXSIZE;
        printf("操作提示:%d 已出队!",*x);
        if(Q->front == Q->rear)   //如果此时队头和队尾相等,则设置tag为0,表示队列为空
        {
            Q->tag = 0;
        }
    }
}
int printSeqQueue(SeqQueue *Q,int count)
{
	int n;
	if((Q->front==Q->rear)&&(Q->tag==0))
		printf("操作提示:队列为空!");
	else
	{
		printf("操作结果:");
		for(n=Q->front;count>0;n++)
			{
				printf("%d ",Q->elem[n]);
				count--;
			}
	}
	return TRUE;
}


int main()
{
	SeqQueue Q;
	int i=1,count=0;     //count记录队列中剩余数据
	SeqQueueElemType x;
	Q.front=Q.rear=0;
	Q.tag=0;  //在主函数提前置空队列,防止程序异常结束。 tag=0;
	while(i)
	{
			printf("\n*****************");
			printf("\n*       menue   *");
			//printf("\n*1    置空队列  *");
			printf("\n*1      入队    *");
			printf("\n*2      出队    *");
			//printf("\n*4    打印队列  *");
			printf("\n*3      退出    *");
			printf("\n*****************\n");
			printf("请选择:");
		scanf_s("%d",&i);
		switch(i)
		{
			case 1:
				printf("请输入数据:");
				scanf_s("%d",&x);
				EnterQueue(&Q,x);
				count++;				//每输入一个数据,数据剩余记录+1
				if (count>MAXSIZE)		//如果数据超出限制,则限制count为最大值 防止输出溢出
					count=MAXSIZE;
				break;
			case 2:
				DeleteQueue(&Q,&x);
				count--;//每出列一个数据,队列中剩余数据-1
				break;
			case 3:
				printf("操作提示:再见\n");
				return 0;
			default:
				printf("操作提示:选择错误,请重新选择!");
				break;
		}
	}
}


转载于:https://www.cnblogs.com/desola/p/12616375.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。 的相关文章

  • 如何像 youtube 一样在纸板中观看普通视频

    我有一个可以正常播放的应用程序VR视频 我的应用程序有两个玩家可以玩这两种类型 在我的VrVideoView有一个按钮可以让视频播放立体声模式 我的问题是 我怎样才能观看正常的视频Cardboard就像YouTube app None
  • 偶尔连接的 CQRS 系统 - 客户端和服务器命令 - 基于任务的屏幕

    Premise 建议在CQRS DDD ES样式应用程序使用task基于屏幕 这些屏幕引导用户并捕获意图 These task屏幕也可以称为感应式用户界面 UI 设计指南的一些示例可以帮助您创建现代的 用户友好的应用程序 Microsoft
  • Java 中的下载管理器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要通过 FTP HTTP 从 Java 获取几个大文件 几个演出 有现成的库 java 命令行工具
  • Hibernate Envers:如何捕获谁删除了审计表中的实体

    我在用hibernate envers with spring 一切工作正常 除了当我删除一个实体时 它不会改变的值updated by and updated date在审计表内 它会在之后保存一个与之前完全相同的实体 仅复制 sprin
  • 如何打印Oracle中过程的定义?

    oracle中有没有办法查看过程的结构是什么 我正在尝试记录并运行程序 并希望将实际的程序结构存储在我的日志中 您可以查询ALL SOURCE table SELECT text FROM all source WHERE owner lt
  • 内容是从 WiFi 直接传输到 Chromecast,还是从 WiFi 传输到 Android 再传输到 Chromecast?

    内容是从 WiFi 直接传输到 Chromecast 还是从 WiFi 传输到 Android 或任何其他设备 再传输到 Chromecast 我知道其他设备可用于控制 Chromecast 但我只想知道由于电池寿命的原因 您是否可以直接从
  • 在magento Attributes中添加自定义属性并显示在前端

    我已经开始使用 magento 作为我的电子商务 cms 我知道这是一个非常强大的平台 最近 我发现它的功能可以帮助开发人员扩展核心 并且我已经成功添加了自定义类别选项 是否有机会在某个属性上达到相同的结果 我想在属性选项卡上添加文本描述并
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图
  • 解析用户周围的位置

    您好 我开发了一个应用程序 我想问一个问题 在我的数据云解析中 我有 餐馆 类 我有三列 名称 类型字符串 imageFile 类型文件 description 类型数组和 Location 类型GeoPoint 我想知道使用哪种方法来获取
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • MVC ASP.NET 或 Razor

    我对 MVC 很陌生 我对 Silver light WPF 和 MVVM 有相当多的了解 但对 MVC 知之甚少 我正在按照 Microsoft 网站上的主要教程进行操作http www asp net mvc tutorials get
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 重定向到其他控制器中的操作

    我想从一个控制器中的操作重定向到第二个控制器中的操作 通常我会使用 RedirectToAction actionName controllerName objects 我想要重定向到的方法有两个重载 一个用于 HttpVerbs Get
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个
  • 在 MVC4 中使函数异步时 HttpContext.Current null

    我目前正在 VS2010 SP1 中开发 MVC4 我做了其中一个功能 控制器类异步 作为其中的一部分 我制作了控制器类 派生自 AsyncController 并添加了以下两个方法 参见代码部分 1 和 2 下 一种以 Async 结尾的
  • simple_fields_for 没有出现 [rails 4]

    我正在尝试创建两个隐藏字段 其中一个显示没有问题 但来自嵌套表单的另一个则没有 产品 rb class Product lt ActiveRecord Base has many product options dependent dest
  • jsf文件下载不起作用

    当我点击h commandButton它执行myBean dowanlod 方法 但它不下载任何文件 这是我在支持 bean 中的方法 没有例外 光标变得忙碌 似乎在等待响应 对于这种操作是否有任何额外的配置或者这段代码有什么问题吗
  • 如何在 Laravel 中创建一条包罗万象的路线

    我需要一个 Laravelroutes php将捕获所有流量到特定的条目example com premium section网站 以便我可以提示人们在访问优质内容之前成为会员 您还可以通过在参数上使用正则表达式来捕获 全部 Route g

随机推荐