数据结构之队列的学习程序实例

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)

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值