数据结构 - 顺序队的基本操作(C语言)

队列定义:只允许在表的一端插入,另一端删除的限定性线性表。并且把允许插入的一端叫队尾(rear),把允许删除的一端叫队头(front)。

特点:先进先出。

当然,队列也有顺序存储和链式存储两种。现在,我们先来看看顺序存储结构的队列。

队列的顺序实现需要注意的几点:

(1):利用一维数组作队列的顺序存储结构。并设立一个指向对头的指针front,一个指向队尾的指针rear。

(2):入队:rear++;出队:front++。

(3):约定:在非空队列中,头指针front总是指向队列中实际队头元素的前面一个位置。

以此它的存储结构如下:

typedef int DataType;

typedef struct
{
	DataType data[MAXSIZE];
	int rear,front;
}SeQueue;
然而,这样便出现了'假溢出'现象:队尾指针已经移到最后,再有元素入队就会出现溢出,而事实上并未'满员'。解决假溢出现象就是循环队列,充分利用。下篇文章会给出。

顺序队的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define TRUE 1
#define FALSE 0

#define MAXSIZE 100

typedef int DataType;

typedef struct
{
	DataType data[MAXSIZE];
	int rear,front;
}SeQueue;

void Init_SeQueue(SeQueue *sq);		/*顺序队的初始化*/

int Empty_SeQueue(SeQueue *sq);		/*判空*/

int IsFull_SeQueue(SeQueue *sq);	/*判满*/ 

int Push_SeQueue(SeQueue *sq,DataType x);	/*入队*/

DataType Pop_SeQueue(SeQueue *sq);	 /*出队*/

void Print_SeQueue(SeQueue *sq);	/*打印*/ 

int main()
{
	SeQueue *sq = (SeQueue*)malloc(sizeof(SeQueue));
	
	/*---------------顺序队的初始化-----------*/ 
	Init_SeQueue(sq);
	
	/*----------------入队并打印--------------*/ 
	DataType x;
	printf("请输入队内元素,按-1结束:");
	scanf("%d",&x);
	while(x!=-1){
		if(Push_SeQueue(sq,x)==FALSE){
			printf("System Error!\n");
			break; 
		}
	scanf("%d",&x);
	}
	printf("\n入队后队内元素如下:");
	Print_SeQueue(sq);
	
	/*----------------出队并打印--------------*/ 
	printf("\n正在出队");
	for(int i=0;i<=2;i++){
		Sleep(400);
		printf(".");
	}
	x = Pop_SeQueue(sq);
	if(x==FALSE){
		printf("System Error!\n");
	}
	else printf("队头元素为:%d\n\n",x);
	
	return 0;
}

void Init_SeQueue(SeQueue *sq)	/*顺序队的初始化*/
{
	sq->rear = sq->front = -1;	/*初始化队时,空队列的front=rear=-1*/ 
}

int Empty_SeQueue(SeQueue *sq)		/*判空*/ 
{
	if(sq->rear == sq->front) return FALSE;
	else return TRUE;
}

int IsFull_SeQueue(SeQueue *sq)		/*判满*/
{
	if(sq->rear - sq->front == MAXSIZE) return FALSE;
	else return TRUE;
}

int Push_SeQueue(SeQueue *sq,DataType x)	/*入队.*/
{
	if(IsFull_SeQueue(sq)==TRUE){
		sq->data[++sq->rear] = x; 	/*队尾指针加1*/
		return TRUE;
	}
	else return FALSE;
}

DataType Pop_SeQueue(SeQueue *sq)	 /*出队*/
{
	if(Empty_SeQueue(sq)==TRUE){
		return sq->data[sq->rear--];	/*队头指针加1*/ 
	}
	else return FALSE; 
}

void Print_SeQueue(SeQueue *sq)		/*打印*/
{
	int i=0;
	for(i=sq->front+1;i<=sq->rear;i++){
		printf("%d ",sq->data[i]);
	}
	printf("\n");
}
运行结果如下:



  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值