1. 建立循环队列。
2. 在循环队列上实现入队、出队等操作。
3. 建立链队列。
4. 在链队列上实现入队、出队等操作。
5. 用队列实现杨辉三角形的打印。(选做)
# define _CRT_SECURE_NO_WARNINGS
# include "stdio.h"
# include "stdlib.h"
#define MAXSIZE 1024
typedef int elemtype;
typedef struct SequenQueue
{
elemtype data[MAXSIZE];
int front;
int rear;
} SequenQueue;
SequenQueue * init_SequenQueue()
{
SequenQueue* Q;
Q = (SequenQueue*)malloc(sizeof(SequenQueue));
Q->front = 0;
Q->rear = 0;
return Q;
}
int SequenQueue_Empty(SequenQueue* Q)
{
if (Q->front== Q->rear)
{
return 1;
}
else { return 0;}
}
int SequenQueue_Full(SequenQueue *Q)
{if((Q->rear+1)% MAXSIZE==Q->front)
{return 1;}
else { return 0;}
}
int SequenQueue_Length(SequenQueue *Q)
{
return(((Q->rear - Q->front) + MAXSIZE) % MAXSIZE);
}
int Enter_SequenQueue(SequenQueue *Q,elemtype x)
{
if (SequenQueue_Full(Q)) { return 0;}
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
int Delete_SequenQueue(SequenQueue* Q,int *x)
{
if (SequenQueue_Empty(Q)){return 0;}
*x = Q->data[Q->front];
Q->front=(Q->front+1)% MAXSIZE;
return 1;
}
int Print_SequenQueue(SequenQueue* Q)//队列先进先出
{
if (Q->front == Q->rear) {
printf("该队列已空n"); return 0;
}
int p = Q->front;
while (Q->rear != p)
{
printf("%d", Q->data[p]);
p = (p + 1) % MAXSIZE;
}
return 1;
}
int Destroy_SequenQueue(SequenQueue* Q)//置空队列
{
int i;
Q->front = 0;
Q->rear = 0;
return 0;
}
int GetTop_linkedStack(SequenQueue* Q, int* x)
{
*x = Q->data[Q->front];
return 1;
}
void menu()
{
printf("n***********欢迎使用队列操作系统*************n");
printf("n***********1初始化队列*************n");
printf("n***********2入队*************n");
printf("n***********3出队*************n");
printf("n***********4求队列的元素个数*************n");
printf("n***********5遍历输出循环队列*************n");
printf("n***********6置空队列*************n");
printf("n***********7求队列的第一个元素*************n");
printf("n***********8打印杨辉三角形*************n");
printf("n***********请输入操作指令:*************n");
}
void YHTriangle(int n)
{
SequenQueue* Q = init_SequenQueue();
int a1, a2; int i, k;
printf("%dn", 1);
Enter_SequenQueue(Q, 1); Enter_SequenQueue(Q, 1);
for (int i = 2; i <= n; i++)//打印第i行数据元素
{
Enter_SequenQueue(Q, 1);//i进第一个
for (int k = 0; k <= i - 2; k++)//i+1进第2-n-2个
{
Delete_SequenQueue(Q, &a1);
printf("%dt", a1);
GetTop_linkedStack(Q, &a2);
Enter_SequenQueue(Q, a1 + a2);
}
Delete_SequenQueue(Q, &a2);
printf("%dn", a2);
Enter_SequenQueue(Q, 1);//进最后一个
}
}
int main()
{
SequenQueue *Q= init_SequenQueue();
menu();
while (1)
{
int c;
scanf("%d", &c);
if (c < 1 || c>8)
{
printf("输入错误请重新输入n");
scanf("%d", &c);
}
switch (c) {
case 1: {Q = init_SequenQueue(); printf("循环队列初始化成功n"); printf("该操作完成请输入下一步指令n");
} break;
case 2: {
printf("请输入要入队的元素个数n");
int num;
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
int n;
scanf("%d", &n);
Enter_SequenQueue(Q, n);
}
printf("该操作完成请输入下一步指令n"); } break;
case 3: {printf("请输入出队的元素个数n");
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
int x;
Delete_SequenQueue(Q,&x);
}printf("该操作完成请输入下一步指令n"); }break;
case 4: {int p = SequenQueue_Length(Q);
printf("该循环队列长度为:%d", p); printf("该操作完成请输入下一步指令n"); } break;
case 5: {Print_SequenQueue(Q); printf("该操作完成请输入下一步指令n"); } break;
case 6:{Destroy_SequenQueue(Q); printf("该操作完成请输入下一步指令n");
} break;
case 7: {int b; GetTop_linkedStack(Q, &b);
printf("队列的第一个元素: %d", b); }break;
case 8: {YHTriangle(7); }break;
}
}
}
链队列:
# define _CRT_SECURE_NO_WARNINGS
# include "stdio.h"
# include "stdlib.h"
typedef int elemtype;
typedef struct linkQueueNode//
{
elemtype data;
struct linkQueueNode* next;
}linkQueueNode;
typedef struct LQueue
{
struct linkQueueNode* front;
struct linkQueueNode* rear;
}LQueue, * linkQueue;
linkQueue init_linkQueueNode()
{
linkQueue Q = (linkQueue)malloc(sizeof(LQueue));//为链队的头尾指针分配存储空间
linkQueueNode* head = (linkQueueNode*)malloc(sizeof(linkQueueNode));//为链队的头节点分配存储空间
head->next = NULL;
Q->front = head;
Q->rear = head;
return Q;
}
int linkQueueNode_Empty(linkQueue Q)
{
if (Q->front == Q->rear)
return 1;
else
return 0;
}
int Enter_linkQueueNode(linkQueue Q, elemtype x)
{
linkQueueNode* node = (linkQueueNode*)malloc(sizeof(linkQueueNode));
node->data = x;
node->next = NULL;
Q->rear->next = node;
Q->rear = node;
return 0;
}
int delete_linkQueueNode(linkQueue Q)//队列先进先出
{
if (linkQueueNode_Empty(Q)) return 0;
else {
linkQueueNode* p;
int m = Q->front->data;
p = Q->front->next;
Q->front->next = p->next;
free(p);
return 1;
}
}
int Length_linkQueueNode(linkQueue Q)
{
int i = 0;
linkQueueNode* p;
p = Q->front->next;
while(p!=NULL)
{
i++; p = p->next;
}
printf("链表长度为:%d", i);
return i;
}
void print_linkQueueNode(linkQueue Q)//从前往后打印
{
linkQueueNode* p;
p= Q->front->next;
while (p != NULL)
{
printf("%dt", p->data);
p = p->next;
}
}
void Destroy_SequenQueue(linkQueue Q)
{
Q->front ->next= NULL;
Q->rear ->next= NULL;
}
void menu()
{
printf("n***********欢迎使用队列操作系统*************n");
printf("n***********1初始化队列*************n");
printf("n***********2入队*************n");
printf("n***********3出队*************n");
printf("n***********4求队列的元素个数*************n");
printf("n***********5遍历输出循环队列*************n");
printf("n***********6置空队列*************n");
printf("n***********请输入操作指令:*************n");
}
int main()
{
linkQueue Q = init_linkQueueNode();
menu();
while (1)
{
int c;
scanf("%d", &c);
if (c < 1 || c>6)
{
printf("输入错误请重新输入n");
scanf("%d", &c);
}
switch (c) {
case 1: {Q = init_linkQueueNode(); printf("循环队列初始化成功n"); printf("该操作完成请输入下一步指令n");
} break;
case 2: {
printf("请输入要入队的元素个数n");
int num;
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
int n;
scanf("%d", &n);
Enter_linkQueueNode(Q, n);
}
printf("该操作完成请输入下一步指令n"); } break;
case 3: {printf("请输入出队的元素个数n");
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
delete_linkQueueNode(Q);
}printf("该操作完成请输入下一步指令n"); }break;
case 4: {int p = Length_linkQueueNode(Q);
printf("该队列长度为:%d", p); printf("该操作完成请输入下一步指令n"); } break;
case 5: {print_linkQueueNode(Q); printf("该操作完成请输入下一步指令n"); } break;
case 6: {Destroy_SequenQueue(Q); printf("该操作完成请输入下一步指令n");
} break;
}
}
}



