队列

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值