資料結構與演算法分析c語言描述(Mark Allen)--迴圈佇列ADT陣列實現
阿新 • • 發佈:2018-11-11
迴圈佇列ADT陣列實現
- 使用陣列儲存
- 操作集合
- 入隊
- 出隊
- 清空
- 初始化
- 返回隊前元素
- 列印
重點注意!
對於一個迴圈佇列
front == rear時候佇列可能是空可能是滿的
解決方案:
1.使用一個額外變數標記Size表示當前的元素個數或者
Tag(刪除是0 插入是1,當rear==front時候,判斷最後一次操作是1還是0即可判斷是空還是滿)
2.只使用n-1個數組空間
這裡使用第二種實現方案
原始檔
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
//最大的儲存元素個數
const int MaxSize = 16;
//重點注意!
//對於一個迴圈佇列
//front == rear時候佇列可能是空可能是滿的
//解決方案:
//1.使用一個額外變數標記Size表示當前的元素個數或者
//Tag(刪除是0 插入是1,當rear==front時候,判斷最後一次操作是1還是0即可判斷是空還是滿)
//2.只使用n-1個數組空間
//這裡使用第二種實現方案
//結構體
//陣列實現 迴圈佇列
struct QNode
{
ElementType *Data;
int rear;
int front;
int MaxSize;
};
typedef struct QNode *Queue;
#ifndef _Queue_H
//列印
void PrintQ(Queue Q);
//建一個空的隊
Queue CreatQueue(int MaxSize);
//判斷佇列Q是否已經滿了
int IsFullQ(Queue Q, int MaxSize);
//將資料元素item插入到佇列中
void AddQ(Queue Q, ElementType X);
//判斷佇列是否是空的
int IsEmptyQ(Queue Q);
//刪除隊頭元素並且返回
ElementType DeleteQ(Queue Q);
#endif // !_Queue_H
int main(int argc, char const *argv[])
{
Queue Q = nullptr;
int choose;
printf("\t\t\tplease intput a int to do something.\n");
printf("\t\t\t1.push\n");
printf("\t\t\t2.pop.\n");
printf("\t\t\t3.isfull?\n");
printf("\t\t\t4.isempty?\n");
printf("\t\t\t5.show.\n");
Q = CreatQueue(MaxSize);
int num;
while (~scanf("%d", &choose))
{
if (choose == 0)
{
break;
}
switch (choose)
{
case 1:
printf("\t\t\tinput a int.\n");
scanf("%d", &num);
AddQ(Q, num);
PrintQ(Q);
break;
case 2:
printf("the front element is %d\n", DeleteQ(Q));
PrintQ(Q);
break;
case 3:
if (IsFullQ(Q,Q->MaxSize))
printf("full!\n");
else
printf("not yet.\n");
break;
case 4:
if(IsEmptyQ(Q))
{
printf("it is empty.\n");
}
else
{
printf("no yet.\n");
}
break;
case 5:
PrintQ(Q);
break;
}
}
system("pause");
return 0;
}
//建一個空的隊
Queue CreatQueue(int MaxSize)
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(sizeof(ElementType) * MaxSize);
Q->rear = Q->front = 0;
Q->MaxSize = MaxSize;
return Q;
}
//判斷佇列Q是否已經滿了
int IsFullQ(Queue Q, int MaxSize)
{
return ((Q->rear + 1) % Q->MaxSize == Q->front);
}
//將資料元素item插入到佇列中
void AddQ(Queue Q, ElementType X)
{
if ((Q->rear + 1) % Q->MaxSize == Q->front)
{
printf("full queue.\n");
return;
}
//插入後rear向後挪動一個位置
Q->rear = (Q->rear + 1) % Q->MaxSize;
Q->Data[Q->rear] = X;
}
//判斷佇列是否是空的
int IsEmptyQ(Queue Q)
{
return Q->rear == Q->front;
}
//刪除隊頭元素並且返回
ElementType DeleteQ(Queue Q)
{
if (IsEmptyQ(Q))
{
printf("queue is empty.\n");
return -1;
}
else
{
Q->front = (Q->front + 1) % Q->MaxSize;
return Q->Data[Q->front];
}
}
//列印
void PrintQ(Queue Q)
{
if (Q->rear < Q->front)
{
for (int i = Q->front; i <= Q->MaxSize - 1; i++)
{
printf("%d-", Q->Data[i]);
}
for (int i = 0; i <= Q->rear; i++)
{
printf("%d-", Q->Data[i]);
}
}
else
{
for (int i = Q->front + 1; i <= Q->rear; i++)
{
printf("%d-", Q->Data[i]);
}
}
putchar('\n');
}