1.队列的顺序存储结构
#define QElemType int
#define Queue_Size 100
typedef struct {
QElemType data[Queue_Size];
int front, rear;
}SeqQueue;
2.队列的基本操作
/// <summary>
/// initialize the queue, make it a empty queue
/// </summary>
/// <param name="Q">is a queue</param>
void InitQueue(SeqQueue* Q)
{
Q->front = Q->rear = 0;
}
/// <summary>
/// judge if the queue is empty or not
/// </summary>
/// <param name="Q">1 is empty, and 0 is not.</param>
/// <returns></returns>
int IsEmpty(SeqQueue* Q)
{
return (Q->front == Q->rear) ? 1 : 0;
}
/// <summary>
/// judge if the queue is full or not
/// </summary>
/// <param name="Q">is a queue</param>
/// <returns>1 is full, and 0 is not</returns>
int IsFull(SeqQueue* Q)
{
/*int i, j;
i = (Q->rear + 1) % Queue_Size;
j = Q->front;
if (i == j)return 1;
else return 0;*/
return ((Q->rear + 1) % Queue_Size == Q->front) ? 1 : 0;
}
/// <summary>
/// put data into queue
/// </summary>
/// <param name="Q">is a queue</param>
/// <param name="e">is the data you want to put in</param>
/// <returns>1 is success, and 0 is fail</returns>
int EnterQueue(SeqQueue* Q, QElemType e)
{
if (IsFull(Q))return 0;
else {
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % Queue_Size;
return 1;
}
}
/// <summary>
/// delete data from queue
/// </summary>
/// <param name="Q">is a queue</param>
/// <param name="e">is the data you had delete</param>
/// <returns>1 is success, and 0 is fail</returns>
int DeleteQueue(SeqQueue* Q, QElemType* e)
{
if (IsEmpty(Q))return 0;
else {
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % Queue_Size;
return 1;
}
}
/// <summary>
/// get the head-data of queue
/// </summary>
/// <param name="Q">is a queue</param>
/// <param name="e">is the data you had get from queue</param>
/// <returns>1 is success, and 0 is fail</returns>
int GetHead(SeqQueue* Q, QElemType* e)
{
if (IsEmpty(Q))return 0;
else {
*e = Q->data[Q->front];
return 1;
}
}
/// <summary>
/// make the queue empty
/// </summary>
/// <param name="Q">is a queue</param>
void ClearQueue(SeqQueue* Q)
{
Q->front = Q->rear = 0;
}
3.主程序及验证
通过杨辉三角的打印来验证程序
#include<stdio.h>
void InitQueue(SeqQueue* Q);
int IsEmpty(SeqQueue* Q);
int IsFull(SeqQueue* Q);
int EnterQueue(SeqQueue* Q, QElemType e);
int DeleteQueue(SeqQueue* Q, QElemType* e);
int GetHead(SeqQueue* Q, QElemType* e);
void ClearQueue(SeqQueue* Q);
void YHTriangle(SeqQueue*Q,int n);
int main(void)
{
SeqQueue q, * ptrq = &q;
InitQueue(ptrq);
IsEmpty(ptrq);
IsFull(ptrq);
int i, temp;
for (i = 1; i <= 5; i++) {
EnterQueue(ptrq, i);
GetHead(ptrq, &temp);
printf("%d had entered\n",temp);
DeleteQueue(ptrq, &temp);
}
ClearQueue(ptrq);
YHTriangle(ptrq, 5);
return 0;
}
/// <summary>
/// make a YHTriangle with a empty queue
/// </summary>
/// <param name="Q">is a empty queue</param>
/// <param name="n">is the number of lines</param>
void YHTriangle(SeqQueue* Q, int n)
{
if (!IsEmpty(Q))return;
else if (n == 1)printf("1\n");
else if (n == 2)printf("1 1\n");
else {
EnterQueue(Q, 1);
EnterQueue(Q, 1);
printf("1\n1 1\n");
int i, pre, k;
for (i = 2; i < n ; i++) {
DeleteQueue(Q, &pre);
EnterQueue(Q, pre);
printf("%d ", pre);
do {
DeleteQueue(Q, &k);
EnterQueue(Q, pre + k);
printf("%d ", pre + k);
pre = k;
} while (k != 1);
EnterQueue(Q, k);
printf("%d\n", k);
}
}
}
4.运行结果截图(Visual Studio 2022)