队列的线性存储结构 c语言 数据结构 简单易懂 超详细~~

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
#define maxsize 100
typedef struct queue
{//注意再用顺序结构来表示栈和队列时,不用再进行node节点的定义了
//首先我们不需要指针了,并且数据域可以放在队列中的数组里
int rear;
int front;
int nodes[maxsize];
}queue;
queue* initqueue();//队列的初始化
bool enqueue(queue*,int);//入队
bool outqueue(queue*);//出队
void getqueuefront(queue*);//取队列对头元素
bool isemptyqueue(queue*);//判断队列是否为空
bool isfullqueue(queue*);//判断队列是否已满
void traverse(queue*);//遍历栈的所有元素
void calculte(queue*);//获取栈的长度
int main(void)
{
queue q=initqueue();//初始化队列
enqueue(q, 1);//入队
enqueue(q, 2);
enqueue(q, 3);
enqueue(q, 4);
traverse(q);//遍历
calculte(q);//计算队列的元素的个数
outqueue(q);//出队
getqueuefront(q);//取得队列的首元素
traverse(q);
calculte(q);
}
queue
initqueue()
{
queue sQ = (queue)malloc(sizeof(queue));
if (!sQ)
{
printf(“分配内存空间失败\n”);
return 0;
}
else
{
sQ->front = sQ->rear = 0;
printf(“队列初始化完成\n”);
}
return sQ;
}
bool isfullqueue(queuesQ)
{
if (sQ->rear > maxsize)
{//sQ->rear指向队列的最后一个元素的下一个元素
//如果sQ->rear刚好等于maxsize,说明还可以装下数据
//大于就不可以了
return true;
}
else
{
return false;
}
}
bool enqueue(queue
sQ,int val)
{//入队和出队最好是有返回值类型的原因是,当遇到条件不满足的时候
//(队列已满,或队列为空的时候就可以return false返回程序
//而程序遇到return就会返回,就特别好
if (isfullqueue(sQ))
{//因为本程序中的队列使用线性表来实现的,自然就会有内存溢出的情况,所以在入队的时候应该首席按考虑队列是否已满
printf(“队列已满,无法入队\n”);
return false;
}
else
{
sQ->nodes[sQ->rear] = val;
sQ->rear++;
return true;
printf(“入队成功\n”);
}
}
bool isemptyqueue(queuesQ)
{
if (sQ->rear == sQ->front)
{//当队列的front和rear指向同一个位置时,队列中就没有任何一个元素,队列为空,
printf(“队列为空\n”);
return true;
}
else
{
return false;
}
}
bool outqueue(queue
sQ)
{
int val = 0;
if (isfullqueue(sQ))
{//注意队列必须是非空,才可以出队
printf(“队列为空,出栈失败\n”);
return false;
}
else
{
val = sQ->nodes[sQ->rear - 1];
sQ->rear–;
printf("%d已出队成功\n",val);
return true;
}
}
void getqueuefront(queuesQ)
{
int val = 0;
if (isemptyqueue(sQ))
{
printf(“队列为空,无法取得首元素\n”);
}
else
{//至于rear指针为什么要减1.因为rear是指向了最后一个元素的下一个位置,那么我们取最后一个元素的值,自然要取该位置减去1之后的值。
val = sQ->nodes[sQ->rear - 1];
printf(“队列首元素为%d\n”, val);
}
}
void traverse(queue
sQ)
{
int i = sQ->rear - 1;
if (isemptyqueue(sQ))
{
printf(“队列为空,无法进行遍历\n”);
}
else
{
while (i != -1)
{//为什么i!=-1作为循环结束的条件,因为i=0时,是储存了数据元素的,所以当我们遍历了0这个下标所对应的元素之后就没有元素了,那么循环就可以结束了,结束之后(即i=0之后,i再减1,那么循环结束的条件就是i!=-1)
printf("%d\t", sQ->nodes[i]);
i–;
}
//当然遍历也可以从第一个元素开始,到最后一个元素结束
}
printf(“队列的所有元素已经遍历成功\n”);
}
void calculte(queue*sQ)
{
int i = sQ->rear-1;
int count = 0;//count为计数器
while (i != -1)
//注意队列初始化为0时,0这个位置也是存储有元素的
{
count++;
i–;//注意每进行一个循环,i的值都要减1,否则会成为死循环。
}
printf(“队列的长度为%d\n”, count);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值