1.队列的定义及特点
- 定义:队列也是一种运算首先的线性表,他的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出)而删除只能在表的另一端进行(只出不进),允许删除的一端称为队头(Front),允许插入的一端称为队尾(rear),当线性表中没有元素时,称为“空队”。
- 特点:先进先出(FIFO)。
2.循环队列
3.顺序循环队列程序实例
头文件:include/seq_shunxu.h
#ifndef SEQ_SHUNXU_H
#define SEQ_SHUNXU_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxsize 6
typedef int datatype;
typedef struct sequence{
datatype data[maxsize];
int front;
int rear;
}seq,*seqP;
void initSeq(seqP sq);//初始化队列
void setEmptySeq(seqP sq); //置空队列
int isEmpty(seqP sq);//判空队列
int isFull(seqP sq); //判满队列
int inSeq(seqP sq, int x); //入队
int outSeq(seqP sq, int *x); //出队
#endif
功能函数:src/func_seq_shunxu.c
#include "seq_shunxu.h"
void initSeq(seqP sq)
{
sq->front = 0;
sq->rear = 0;
}
void setEmptySeq(seqP sq)
{
sq->front = 0;
sq->rear = 0;
}
int isEmpty(seqP sq)
{
return (sq->front==sq->rear)?1:0;
}
int isFull(seqP sq)
{
return (sq->front==((sq->rear+1)%maxsize))?1:0;
}
int inSeq(seqP sq, int x)
{
if(isFull(sq))
{
printf("队列已满!\n");
return -1;
}
sq->data[sq->rear] = x;
sq->rear = (sq->rear+1)%maxsize;
return 0;
}
int outSeq(seqP sq, int *x)
{
if(isEmpty(sq))
{
printf("队列为空!\n");
return -1;
}
*x = sq->data[sq->front++];
return 0;
}
主函数:src/main_seq_shunxu.c
#include "seq_shunxu.h"
int main()
{
int i = 0;
int j = 0;
int ret = 0;
int in_val = 0;
int out_val = 0;
seqP sq;
sq = (seqP)malloc(sizeof(seq));
if(sq==NULL)
{
printf("malloc error!\n");
return -1;
}
initSeq(sq);
for(i=0;i<5;i++)
{
printf("请输入要进入队列的元素:");
scanf("%d", &in_val);
ret = inSeq(sq, in_val);
if(ret)
{
printf("元素入队列失败!\n");
return -1;
}
}
printf("sq->front[%d];sq->rear[%d]\n", sq->front, sq->rear);
for(i=0;i<5;i++)
{
printf("第[%d]个元素是[%d]\n", i+1, sq->data[i]);
}
printf("\n开始出队列:\n");
for(i=0;i<3;i++)
{
ret = outSeq(sq, &out_val);
if(ret)
{
printf("元素出队列失败!\n");
return -1;
}
printf("第[%d]个出队列元素是[%d]\n", i+1, out_val);
}
printf("\n当前队列各元素值:\n");
printf("sq->front[%d];sq->rear[%d]\n", sq->front, sq->rear);
j = sq->front;
while(j!=sq->rear)
{
printf("当前队列元素[%d]\n", sq->data[j]);
j++;
}
printf("\n再次入队列:\n");
for(i=0;i<3;i++)
{
printf("请输入需要入队列的元素值:");
scanf("%d", &in_val);
ret = inSeq(sq, in_val);
if(ret)
{
printf("元素[%d]入队列失败!\n", in_val);
return -1;
}
}
printf("sq->front[%d];sq->rear[%d]\n", sq->front, sq->rear);
j = sq->front;
while(j!=sq->rear)
{
printf("当前队列元素值为[%d]\n", sq->data[j]);
j = (j+1)%maxsize;
}
return 0;
}
Makefile:
CC:=gcc
TARGET:=bin/seq_shunxu
DEPEND:=obj/func_seq_shunxu.o obj/main_seq_shunxu.o
INCLUDE:=-Iinclude
$(TARGET):$(DEPEND)
$(CC) -o $@ $^
obj/%.o:src/%.c
$(CC) -o $@ $(INCLUDE) -c $^
.PHONY:clean
clean:
rm -f $(DEPEND)