目录
栈:只允许在一端进行入栈和出栈操作的线性表;
队列:允许在一端进行入队,另一端进行出队的线性表。
以下只是顺序队列的形式:

我们主要实现循环队列,因为循环队列的实现和顺序队列差不多,但是在判断队空和队满时需要注意。


循环队列判断队空和队满有三种方法:
(1)方法一:上面给出的(本文主要使用这一种)。
(2)方法二:
首先是另外设置一个标志位以区别队列是“空”还是“满”:比如:标志位 int tag=0(出队);tag(入队);
- if(tag==1&&q.rear==q.front){
- printf("队满");
- }
-
- if(tag==0&&q.rear==q.front){
- printf("队空");
- }
(3)方法二:
使用一个记录元素个数的变量:int size=0;
注:最早进入队列的元素最早出队。其实在操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行,如果运行的结果都需要通过通道输出,那么就要按请求输出的先后次序排队。每当通道传输完毕可以接收新的输出任务时,队头的作业先从队列中退出作业输出操作。比如还有我们在银行排队时也是队列的形式。
- #include
- #include
-
- #define MAXSIZE 5
-
- typedef int ElemType;
-
- typedef struct Qeueu{
- ElemType *data;
- int rear,front;
- int Maxsize;
- }SqQueue;
- //初始化
- void InitSqQueue(SqQueue&q){
- q.data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
- if(q.data==NULL){
- printf("申请空间失败!\n");
- return;
- }
- q.front=0;
- q.rear=0;
- q.Maxsize=MAXSIZE;
- }
-
- //重新申请空间
- void reMalloc(SqQueue&q,int len){
- ElemType*newbase=(ElemType*)realloc(q.data,(q.Maxsize+len)*sizeof(ElemType));
- q.data=newbase;
- q.Maxsize=q.Maxsize+len;
- }
-
- void MenuSqQueue(){
- printf("--------------1.入队操作---------\n");
- printf("--------------2.出队操作---------\n");
- printf("--------------3.获取队头元素-----\n");
- printf("--------------4.重新初始化-------\n");
- printf("--------------5.退出操作---------\n");
- }
- //判断队空
- bool Empty(SqQueue q){
- if(q.front==q.rear){
- return true;
- }else{
- return false;
- }
- }
-
- //判断队满
- bool Full(SqQueue q){
- if((q.rear+1)%q.Maxsize==q.front){
- return true;
- }else{
- return false;
- }
- }
-
- //队中元素
- int QueueLength(SqQueue q){
- int size=(q.rear-q.front+q.Maxsize)%q.Maxsize;
- return size;
- }
- //入队
- void QueuePush(SqQueue&q,ElemType e){
- if(Full(q)){
- printf("队已满!\n");
- printf("请输入申请空间大小: ");
- int len=0;
- scanf("%d",&len);
- reMalloc(q,len);
- printf("当前空间大小: %d\n",q.Maxsize);
- return;
- }
- q.data[q.rear]=e;
- q.rear=(q.rear+1)%q.Maxsize;
- printf("插入元素成功!\n");
- }
- //出队
- void QueueDe(SqQueue&q,ElemType&e,int&mask){
- if(Empty(q)){
- printf("队已空!\n");
- mask=0;
- return;
- }
- e=q.data[q.front];
- q.front=(q.front+1)%q.Maxsize;
- }
-
- //获取队头元素
- void GetQueueHead(SqQueue q,ElemType&e,int&mask){
- if(Empty(q)){
- printf("队已空!\n");
- mask=0;
- return;
- }
- e=q.data[q.front];
- }
-
- int main(){
- SqQueue q;
- ElemType e;
- int flag=0;
- InitSqQueue(q);
- int mask=1;
- while(1){
- MenuSqQueue();
- printf("请输入操作: ");
- scanf("%d",&flag);
- switch(flag){
- case 1:
- printf("请输入元素(-1_end): ");
- scanf("%d",&e);
- while(e!=-1){
- QueuePush(q,e);
- printf("请输入元素(-1_end): ");
- scanf("%d",&e);
- }
- break;
- case 2:
- QueueDe(q,e,mask);
- if(mask!=0){
- printf("出栈元素 = %d\n",e);
- }
- break;
- case 3:
- GetQueueHead(q,e,mask);
- if(mask!=0){
- printf("获取元素 = %d\n",e);
- }
- break;
- case 4:
- InitSqQueue(q);
- printf("初始化成功!\n");
- break;
- default:
- free(q.data);
- printf("操作结束!\n");
- }
- if(flag==5){
- break;
- }
- }
- return 0;
- }
