IsEmpty判断空,EnQueue入队,(栈是push,不过没有什么大的区别)。DeQueue出队。其核心数据也是很相似,也有一个数据区域nData,不过他是队头nHand和队尾nTail。对头定位着将要出队的元素,队尾对应着入队的元素。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//定义一个队列的结构体
struct MyQueue
{
int nTail; //队列尾
int nHead; //队列头
int nData[10]; //队列数据
};
//规则说明:
//nHead 直接指向了对头的数据位置,
//nTail 直接指向了队尾要插入的位置,
//如果nTail==nHead ,队列为空
//nTail 比 nHead位置小一,(就是在他前面一个),代表队满
//所以数组中能存放的数据要比数组的空间小1,是为了判断队列满的情况。
MyQueue g_queue; //定义全局的队列
//判断队列是否为空
bool IsEmpty(void)
{
return (g_queue.nHead == g_queue.nTail); //如果尾等于头,则为空
}
//设置队列为空
int SetEmpty(void)
{
g_queue.nTail = 0; //都设置为零
g_queue.nHead = 0;
return 1;
}
//判断队列是否为满
bool IsFull(void)
{
//如果ntial 比 nHead小1,则栈满。
return (g_queue.nTail + 1) % 10 == g_queue.nHead;
}
//入队
int EnQueue(int nData)
{
assert(!IsFull()); //assert表示断言,断言!IsFull成立,如果不成立,则报告程序错误!
g_queue.nData[g_queue.nTail] = nData;
g_queue.nTail = (g_queue.nTail + 1) % 10;
return (g_queue.nTail - g_queue.nHead) % 10;
}
//出队
int DeQueue(void)
{
assert(!IsEmpty());
int nData = g_queue.nData[g_queue.nHead];
g_queue.nHead = (g_queue.nHead + 1) % 10;
return nData;
}
int main()
{
//测试
SetEmpty(); //设置队列为空
if (IsEmpty()) //判断为空,输出信息
{
printf("The queue is empty!/n");
}
//
for (int i = 0; i < 9; ++i)
{
EnQueue(i);
}
if (IsFull()) //判断队列满
{
printf("The Queue is full/n"); //栈满的英语是不是full啊
}
for (int i = 0; i < 9; ++i) //出队
{
printf("%d ", DeQueue());
}
printf("/n");
if (IsEmpty())
{
printf("The queue is empty!/n");
}
for (int i = 0; i < 8; ++i) //测试出队和入队
{
EnQueue(i);
EnQueue(i*2);
printf("%d ", DeQueue());
}
printf("/n");
while(!IsEmpty())
{
printf("%d ", DeQueue());
}
printf("/n");
system("pause");
return 0;
}
队列
最新推荐文章于 2024-11-13 04:16:23 发布