顺序队列:(如下)
/*此代码为队列,形式为头出尾进,自动默认为循环队列(数组队列)
双指针 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;
}