本次的主题是队列,队列是另一种限定性的线性表(当然是人为规定的),即:它只允许在表的一端插入元素,在另一端删除元素,故具有先进先出(FIFO)的特性。
本次的代码主要涉及到队列的基本操作:
对列的初始化:initsqueueu()
入队操作:entersequeue(sequeue*q,int x)
出队操作:delsequeue(sequeue*q,int*x)
判空操作:empty(sequeue*q)
取队首元素:getseq(sequeue*q,int*x)
打印队列:print(sequeue q)
顺序队列的初始化,使用两个指针front和rear。
typedef struct
{
int data[max];
int front,rear;
}sequeue;
为了实现基本操作,我们约定在非空队列中,头指针front总是指向当前队列的第一个元素的前一个位置,而尾指针rear则总是指向当前队列最后一个元素的所在位置。
因此,我们可以完成一些具体的要求:
队列的初始化条件:q->front=q->rear=-1
队满条件:q->rear=max-1
对空条件:q->front=q->rear
好了,闲话少说,show the code
#include<stdio.h>
#define max 10
typedef struct
{
int data[max];
int front,rear;
}sequeue;
sequeue initsequeue()
{
sequeue q;
q.front=-1;
q.rear=-1;
return q;
}
int getseq(sequeue*q,int*x)
{
if(q->front==q->rear)
return 0;
else
{
*x=q->data[(q->front)+1];
return 1;
}
}
int entersequeue(sequeue*q,int x)
{
if(q->rear==max-1)
return 0;
q->rear++;
q->data[q->rear]=x;
return 1;
}
int empty(sequeue*q)
{
return (q->front==q->rear);
}
int delsequeue(sequeue*q,int*x)
{
if(q->front==q->rear)
return 0;
else
{
q->front++;
*x=q->data[q->front];
return 1;
}
}
void print(sequeue q)
{
int n;
if(q.front!=q.rear)
{
puts("the sequeue out:");
for(n=q.front+1;n<q.rear;n++)
printf("%d ",q.data[n]);
}
else printf("the sequque is empty");
}
int main()
{
sequeue queue;
int n,y,z,i,j;
queue=initsequeue();
if(empty(&queue)!=0)
printf("it is empty");
else printf("\nit is not empty");
printf("\ninput the number:");
scanf("%d",&n);
printf("your number:\n");
for(i=1;i<=n;i++)
{
scanf("%d",&y);
entersequeue(&queue,y);
}
print(queue);
getseq(&queue,&z);
printf("\nnow the front:%d\n",z);
print(queue);
printf("\nyou want to out number:");
scanf("%d",&j);
printf("the had out's sequeue:");
for(i=1;i<=j;i++)
{
delsequeue(&queue,&z);
printf("%d ",z);
}
printf("\n");
print(queue);
if(empty(&queue)!=0)
printf("the queue is empty\n");
else printf("\nthe queue is not empty\n");
return 0;
}
运行截图
总结
还是那句话,这一次的代码虽然长,但是都是由一些定义的函数堆积起来的,或许未来的工程项目也会是如此这般吧。理解起来并非困难,重要的还是对于顺序队列的基本概念的熟悉,当然,还有最重要的是前面的扎实的基础。