数据结构

来源:互联网 发布:高级系统数据库工程师 编辑:程序博客网 时间:2024/05/22 00:30

队列定义:只允许在表的一端插入,另一端删除的限定性线性表。并且把允许插入的一端叫队尾(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 100typedef 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");}
运行结果如下:



原创粉丝点击