顺序队列 和 链队列

顺序队列:(如下)

/*此代码为队列,形式为头出尾进,自动默认为循环队列(数组队列)
双指针 rear(队尾指针)和front(队头指针) 无论是“入队”还是“出队”都是 +1 */
/*是否有分配空间,在运用之前一定要搞明白*/
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>

#define QueueSize 100
int k=0;//用于后续的判断
int ddd=0;//判断是否已经置队列为空

typedef char DataType;//注意是char类型
typedef struct cirQueue{
	DataType data[QueueSize];
	int rear;
	int front;
	int count;//记录个数的
}CirQueue;
CirQueue *Q;

int kk=0;//如果kk不等于0就代表找到了

void menu();//菜单
void InitQueue(CirQueue *Q);//置队列为空
int QueueEmpty(CirQueue *Q);//判断队列是否为空
int QueueFull(CirQueue *Q);//判断队列是否已经满了
int EnQueue(CirQueue *Q,DataType x);//入队
DataType DeQueue(CirQueue *Q);//出队
DataType QueueFront(CirQueue *Q);//取队头元素
void shuchu(CirQueue *Q);//简单输出
void chazhao(CirQueue *Q);//查找
void shuchu_1(CirQueue *Q);//形象输出

int main()
{
	//
	int choose=0;
	char a='a',b,c;
	char baba='a';
	system("color F1");
	printf("*****欢迎来到顺序队列程序*****\n");
	printf("你准备好了吗?");
	system("pause");
	choose=-1;
	menu();
	while(choose != 9)
	{
		printf("\n序号为功能代表,请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
		case 1:
			//置队列为空
			Q=(CirQueue *)malloc(sizeof(CirQueue));
			InitQueue(Q);
			printf("\n队列置空成功!\n");
			ddd=1;
			break;
		case 2:
			//入队列
			if(ddd==1){
				fflush(stdin);//不可省,为获取回车的
				printf("\n请输入需要入队的字符元素:");
				scanf("%c",&a);
				EnQueue(Q,a);
			}
			else{
				puts("请先置队列为空");
			}
			break;
		case 3:
			//出队列
			if(ddd==1){
				printf("\n队列出的位置为首部哦\n");
				b=DeQueue(Q);
				if(k==1)
				{
					printf("出队列的元素为:%c\n",b);
				}
				b=0;
			}
			else{
				puts("请先置队列为空");
			}
			break;
		case 4:
			//取队列首元素
			if(ddd==1){
				c=QueueFront(Q);
				if(k==2)
				{
					printf("队列首的字符元素为:%c\n",c);
				}
				k=0;
			}
			else{
				puts("请先置队列为空");
			}
			break;
		case 5:
			if(ddd==1){
				chazhao(Q);
			}
			else{
				puts("请先置队列为空");
			}
			break;
		case 6:
			//人工清屏功能的实现
			system("cls");
			menu();
			break;
		case 7:
			shuchu(Q);
			break;
		case 8:
			//形象输出
			if(ddd==1){
				shuchu_1(Q);
			}
			else{
				puts("请先置队列为空");
			}
			break;
		case 9:
			//退出
			printf("\n2秒后即将退出程序,祝你生活愉快!\n");
			Sleep(2000);
			exit(0);
		default:
			//
			printf("\n输入有误,请重新输入:");
			break;
		}
	}
	return 0;
}

void shuchu_1(CirQueue *Q)//形象输出
{
	int i=0;
	int wahaha=0;
	CirQueue *q=NULL;
	CirQueue *qq=NULL;
	qq=(CirQueue *)malloc(sizeof(CirQueue));
	q=(CirQueue *)malloc(sizeof(CirQueue));
	q=Q;//正是因为它使用的是Q的地址,所以改变了任何数据都应该变回来
	qq->front=q->front;
	wahaha=q->count;
	//printf("q->count=%d\n",q->count);//调试语句
	puts("\n形象输出如下:\n");
	printf("\n(队头)************************************************\t\n\n");
	for(i=0;i<q->count;i++)
	{
		printf("%c\t",q->data[q->front]);
		q->front=(q->front+1)%QueueSize;
		if((i+1)%5==0)//5个一行
			printf("\n");
	}
	printf("\n\n************************************************(队尾)\t\n");
	q->front=qq->front;
	q->count=wahaha;
}

void shuchu(CirQueue *Q)//输出
{
	//
	int i=0;
	int wahaha=0;
	CirQueue *q=NULL;
	CirQueue *qq=NULL;
	qq=(CirQueue *)malloc(sizeof(CirQueue));
	q=(CirQueue *)malloc(sizeof(CirQueue));
	q=Q;
	qq->front=q->front;
	wahaha=q->count;
	//printf("q->count=%d\n",q->count);//调试语句
	printf("\n里面的元素象征性的输出个数\n");
	printf("\n************************************************\t\n\n");
	for(i=0;i<Q->count;i++)
	{
		printf("第%d个为%c\t",i+1,q->data[q->front]);
		if((i+1)%5==0)
			printf("\n");
		q->front=(q->front+1)%QueueSize;
	}
	printf("\n\n************************************************\t\n");
	q->front=qq->front;
	q->count=wahaha;
}

void chazhao(CirQueue *Q)//查找
{
	//
	int i=0;
	int wahaha=0;
	char ok;
	kk=0;
	CirQueue *q=NULL;
	CirQueue *qq=NULL;
	qq=(CirQueue *)malloc(sizeof(CirQueue));
	q=(CirQueue *)malloc(sizeof(CirQueue));
	q=Q;
	qq->front=q->front;
	wahaha=q->count;
	//printf("q->count=%d\n",q->count);//调试语句
	printf("\n请输入你需要查找的元素:");
	ok=getche();
	for(i=0;i<q->count;i++)
	{
		if(q->data[q->front]==ok)
		{
			printf("\n找到了,它(%c)位于%d个\n",ok,i+1);
			kk++;
		}
		q->front=(q->front+1)%QueueSize;//此处开始无意将此行代码放在在上面的if语句里面,导致的逻辑错误
		//printf("data[%d]=%c",i+1,q->data[q->front]);//调试语句
	}
	if(kk==0)
		printf("\n抱歉,我们没有找到,请查看清楚后再查找!\n");
	q->front=qq->front;//这一步可不能少了,否则就发现根本无法再次正常使用
	q->count=wahaha;
}

void menu()//菜单
{
	//
	printf("\n 1.置队列为空		2.入队列	3.出队列 \n");
	printf("\n 4.取队列首元素		5.查找		6.清屏 \n");
	printf("\n 7.输出			8.形象输出	9.退出 \n");
}
void InitQueue(CirQueue *Q)//置队空
{
	//
	Q->front=Q->rear=0;
	Q->count=0;
}

int QueueEmpty(CirQueue *Q)//判断队列是否为空
{
	//
	return Q->count==0;
}

int QueueFull(CirQueue *Q)//判断队列是否已经满了
{
	//
	return Q->count==QueueSize;
}

int EnQueue(CirQueue *Q,DataType x)//入队
{
	//首先判断队列是否已满
	if(QueueFull(Q))
	{
		printf("\n不好意思,队列已经满了,无法进行入队操作\n");
		return 0;
	}
	Q->count++;
	Q->data[Q->rear]=x;
	Q->rear=(Q->rear+1)%QueueSize;
	puts("*****\t\t入队成功\t\t*****");
	return 1;
}

DataType DeQueue(CirQueue *Q)//出队
{
	//首先需要判断队列是否为空
	DataType temp;
	if(QueueEmpty(Q))
	{
		printf("\n不好意思,队列为空,无法进行出队操作\n");
		return 0;
	}
	k=1;
	Q->count--;
	temp=Q->data[Q->front];
	Q->front=(Q->front+1)%QueueSize;
	return temp;
}

DataType QueueFront(CirQueue *Q)//取队列头元素
{
	//
	if(QueueEmpty(Q))
	{
		printf("\n不好意思,队列为空,无法进行取操作\n");
		return 0;
	}
	k=2;
	return Q->data[Q->front];
}



链队列:(如下)

/*此程序为链队列 头出尾进*/
#include <stdio.h>
#include <windows.h>//Sleep函数需要使用
#include <stdlib.h>//exit()函数需要使用

typedef char DataType;//注意了,又是char类型数据,小心回车的影响
int k=0;//用于后续判断
typedef struct queuenode{
	DataType data;
	struct queuenode *next;//自引用结构
}QueueNode;

typedef struct{
	QueueNode *front;
	QueueNode *rear;
}LinkQueue;

LinkQueue *Q;

void menu();//菜单
void InitQueue(LinkQueue *Q);//置空队
int QueueEmpty(LinkQueue *Q);//判断队列是否为空
void EnQueue(LinkQueue *Q,DataType x);//入队
DataType DeQueue(LinkQueue *Q);//出队
DataType QueueFront(LinkQueue *Q);//取队列头字符元素

int main(void)
{
	//
	int choose=0;
	char a='a', b, c;
	choose=-1;
	system("color F1");
	printf("*****欢迎来到链队列操作系统*****\n");
	puts("你准备好了吗?");
	system("pause");
	menu();
	while(choose!=5)
	{
		printf("前面的序号代表功能,请选择功能:");
		scanf("%d",&choose);
		switch(choose)
		{
		case 1:
			//将队列置空
			Q=(LinkQueue *)malloc(sizeof(LinkQueue));//分配必要所需的空间
			InitQueue(Q);
			break;
		case 2:
			//入队
			printf("请输入需要入队的元素:");
			fflush(stdin);//清除流
			scanf("%c",&a);
			EnQueue(Q,a);
			printf("%c已入链队列\n",a);
			break;
		case 3:
			//出队
			printf("链队列出队是出头部哦\n");
			b=DeQueue(Q);
			if(k==1){
				printf("出链队列的元素是:%c\n",b);
			}
			k=0;
			break;
		case 4:
			//取链队列顶元素
			c=QueueFront(Q);
			if(k==2){
				printf("链队列顶的元素为:%c\n",c);
			}
			k=0;
			break;
		case 5:
			//退出
			printf("\n2秒后即将退出程序,祝你生活愉快!\n");
			Sleep(2000);
			exit(0);
		case 6:
			//人工清屏
			system("cls");
			menu();
			break;
		default:
			printf("\n出现错误,请重新输入!\n");
			//处理未知情况错误
		}
	}
	return 0;
}

void menu()//菜单
{
	printf("\n 1.置队列为空		2.入队		3.出队 \n");
	printf(" 4.取链队列顶元素	5.退出		6.清屏\n");
}

void InitQueue(LinkQueue *Q)//置链队列为空
{
	Q->front=Q->rear=NULL;
	printf("\n已将链队列置空\n");
}

int QueueEmpty(LinkQueue *Q)//判断链队列是否为空
{
	//
	return Q->front==NULL && Q->rear==NULL;
}

void EnQueue(LinkQueue *Q,DataType x)//入链队列
{
	//需要先判断链队列是否为空,不是没的进,而是空队列有不一样的对付方法,不用怕会满
	QueueNode *p;
	p=(QueueNode *)malloc(sizeof(QueueNode));
	p->data=x;//接入数据
	p->next=NULL;
	if(QueueEmpty(Q))
	{
		Q->front=Q->rear=p;
	}
	else
	{
		Q->rear->next=p;
		Q->rear=p;
	}
}

DataType DeQueue(LinkQueue *Q)//出链队列
{
	//首先需要判断链队列是否为空,空的话就没的出了
	DataType x;
	QueueNode *p;
	if(QueueEmpty(Q))
	{
		printf("\n不好意思,我们发现此时的链队列为空,无法进行出队列操作\n");
		return 0;
	}
	p=Q->front;
	x=p->data;
	Q->front=p->next;
	if(Q->rear==p)
	{
		printf("\n原链队列中只有一个数据,此时为空了\n");
		Q->rear=NULL;
	}
	k=1;
	free(p);
	return x;
}

DataType QueueFront(LinkQueue *Q)//取链队列的顶元素
{
	//首先判断队列是否为空,空的话也取不了
	if(QueueEmpty(Q))
	{
		printf("不好意思,我们发现此时的链队列为空,无法取链队列顶部元素\n");
		return 0;
	}
	k=2;
	return Q->front->data;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值