国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

這篇具有很好參考價(jià)值的文章主要介紹了隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??文章主頁(yè):阿博歷練記
??文章專欄:數(shù)據(jù)結(jié)構(gòu)與算法
??代碼倉(cāng)庫(kù):阿博編程日記
??歡迎關(guān)注:歡迎友友們點(diǎn)贊收藏+關(guān)注哦??

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??前言

友友們,上期阿博給大家介紹了棧的實(shí)現(xiàn),今天阿博給大家介紹一種新的數(shù)據(jù)結(jié)構(gòu):隊(duì)列.
隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO(First In First Out)的性質(zhì)。
入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾。
出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭。
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)
隊(duì)列也可以使用數(shù)組鏈表的結(jié)構(gòu)實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組的結(jié)構(gòu),出隊(duì)列在數(shù)組頭上出數(shù)據(jù),效率會(huì)比較低.
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??隊(duì)列

??1.隊(duì)列的結(jié)構(gòu)框架

typedef  int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType  data;
}QNode;
typedef struct  Queue
{
	QNode* phead;
	QNode* ptail;
	int  size;
}Queue;

??友友們注意,這兩個(gè)結(jié)構(gòu)體不能合并到一起,因?yàn)樗鼈兯淼囊饬x不一樣,第一個(gè)結(jié)構(gòu)體是每一個(gè)結(jié)點(diǎn)的結(jié)構(gòu),第二個(gè)結(jié)構(gòu)體代表的是這個(gè)隊(duì)列的結(jié)構(gòu),它表示的是隊(duì)列整體.

??2.隊(duì)列的初始化

void  QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

??為什么初始化不使用二級(jí)指針

??這里有可能友友們會(huì)有疑問(wèn),我們初始化不是要改變phead指針和ptail指針,它們兩個(gè)都是結(jié)構(gòu)體指針,我們要改變它們,為什么不用二級(jí)指針呢?這里友友們注意了,phead指針和ptail指針又在一個(gè)新的結(jié)構(gòu)體Queue里面放著,它們就屬于這個(gè)結(jié)構(gòu)體里面的成員,我們要改變它,只需要傳這個(gè)新結(jié)構(gòu)體的地址就可以訪問(wèn)并改變它們了.
這里阿博給友友們總結(jié)幾種不用二級(jí)指針的方法:
?1.我們?cè)诤瘮?shù)外部定義一個(gè)同類型的指針,通過(guò)返回值的方式接收,這本質(zhì)上是一個(gè)值拷貝(賦值)
?2.帶哨兵位的頭結(jié)點(diǎn),它的本質(zhì)是改變結(jié)構(gòu)體里面的next指針,next指針屬于結(jié)構(gòu)體的成員,所以我們只需要傳結(jié)構(gòu)體的指針就可以訪問(wèn)到它了.
?3.把結(jié)構(gòu)體指針重新放在一個(gè)結(jié)構(gòu)體里面,這樣它就屬于這個(gè)結(jié)構(gòu)體的成員了,我們只需要傳這個(gè)結(jié)構(gòu)體的地址就可以改變結(jié)構(gòu)體指針了.

??3.隊(duì)列的釋放

1.保存下一結(jié)點(diǎn)的地址迭代釋放

void  QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

2.保存當(dāng)前結(jié)點(diǎn)的地址迭代釋放

void  QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
	    QNode* del = cur;
		cur = cur->next;
		free(del);
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

????友友們,這里要注意兩個(gè)點(diǎn):?1.如果保存當(dāng)前結(jié)點(diǎn)的地址的話,我們就需要先讓cur=cur->next往后迭代,然后在釋放保留的那個(gè)地址,如果先釋放的話,那么cur=cur->next這一步就會(huì)報(bào)錯(cuò),此時(shí)cur已經(jīng)被釋放了,我們還在使用,它就是一個(gè)野指針.?2.如果保留下一結(jié)點(diǎn)地址的話,我們就需要先釋放當(dāng)前結(jié)點(diǎn),在讓cur=next往后進(jìn)行迭代,如果我們先往后迭代的話,此時(shí)cur=next已經(jīng)指向下一結(jié)點(diǎn)了,我們?cè)诎阉尫牛@樣就會(huì)導(dǎo)致上一個(gè)結(jié)點(diǎn)沒(méi)有釋放和下次再使用cur就是野指針.????

??4.隊(duì)列的插入數(shù)據(jù)

void  QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		assert(pq->ptail == NULL);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

??友友們注意,就算這里是首次插入數(shù)據(jù),我們也不需要二級(jí)指針,因?yàn)閜head和ptail指針都在結(jié)構(gòu)體里面放著,所以我們傳這個(gè)結(jié)構(gòu)體的指針就可以改變它們.

??5.隊(duì)列的刪除數(shù)據(jù)

?錯(cuò)誤案例

void  QueuePop(Queue* pq)
{
        assert(pq);
        QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
		pq->size--;
}	

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)
?代碼糾正

void  QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	//1個(gè)結(jié)點(diǎn)
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead =pq->ptail= NULL;     //不能對(duì)同一動(dòng)態(tài)開(kāi)辟出來(lái)的空間進(jìn)行多次free釋放,這里我們釋放完pq->phead之后,pq->ptail也已經(jīng)被釋放了,所以我們主要的目的就是把pq->phead和pq->ptail都置空
	}
	//多個(gè)結(jié)點(diǎn)
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}

??友友們注意,pq->phead和pq->ptail指向相同的結(jié)點(diǎn),free(pq->phead)之后就已經(jīng)把這塊內(nèi)存空間釋放了,此時(shí)我們就不能再free(pq->ptail)了,因?yàn)閯?dòng)態(tài)開(kāi)辟出來(lái)的空間不能進(jìn)行多次free釋放.

??6.隊(duì)列取隊(duì)頭數(shù)據(jù)

QDataType  QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->phead->data;
}

這里我們需要斷言隊(duì)列不能為空,如果為空,pq->phead就是空指針,這時(shí)pq->phead->data就是對(duì)空指針的解引用,程序就會(huì)報(bào)錯(cuò).

??7.隊(duì)列取隊(duì)尾數(shù)據(jù)

QDataType  QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->ptail->data;
}

??8.返回隊(duì)列數(shù)據(jù)的個(gè)數(shù)

int   QueueSize(Queue* pq)
{
	assert(pq);
	return  pq->size;
}

??9.判斷隊(duì)列是否為空

bool  QueueEmpty(Queue* pq)
{
	assert(pq);
	return  pq->phead == NULL
		&&  pq->ptail == NULL;
}

??Queue.h代碼

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef  int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType  data;
}QNode;
typedef struct  Queue
{
	QNode* phead;
	QNode* ptail;
	int  size;
}Queue;
void  QueueInit(Queue*pq);
void  QueueDestroy(Queue* pq);
void  QueuePush(Queue* pq, QDataType x);
void  QueuePop(Queue* pq);
QDataType  QueueFront(Queue* pq);
QDataType  QueueBack(Queue* pq);
int   QueueSize(Queue* pq);
bool  QueueEmpty(Queue* pq);

??Queue.c代碼

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void  QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void  QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
		/*QNode* del = cur;
		cur = cur->next;
		free(del);*/
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void  QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		assert(pq->ptail == NULL);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}
void  QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	//1個(gè)結(jié)點(diǎn)
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail=NULL;     //不能對(duì)同一動(dòng)態(tài)開(kāi)辟出來(lái)的空間進(jìn)行多次free釋放,這里我們釋放完pq->phead之后,pq->ptail也已經(jīng)被釋放了,所以我們主要的目的就是把pq->phead和pq->ptail都置空
	}
	//多個(gè)結(jié)點(diǎn)
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}
QDataType  QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->phead->data;
}
QDataType  QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->ptail->data;
}
int   QueueSize(Queue* pq)
{
	assert(pq);
	return  pq->size;
}
bool  QueueEmpty(Queue* pq)
{
	assert(pq);
	return  pq->phead == NULL
		&&  pq->ptail == NULL;
}

??Test.c代碼

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
#include<stdio.h>
TestQueue()
{
	Queue  q;
	QueueInit(&q);

	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	QueueDestroy(&q);
	return  0;
}
int main()
{
	TestQueue();
	return  0;
}

??代碼效果展示

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

1.??題目描述

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??邏輯分析

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

友友們,通過(guò)這里也可以看出我們的入棧順序是1,2,3,我們的出棧順序也是1,2,3.

??代碼實(shí)現(xiàn)

typedef  int  STDataType;
typedef struct  Stack
{
	STDataType* a;
	int top;                    //top指向棧頂?shù)奈恢?/span>
	int capacity;
}ST;

void  STInit(ST* pst);
void  STDestroy(ST* pst);
void  STPush(ST* pst,STDataType x);
STDataType  STTop(ST* pst);
void  STPop(ST* pst);
bool  STEmpty(ST* pst);
int   STSize(ST* pst);

void  STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;    //如果我們初始化為0,top就指向棧頂元素的下一個(gè)位置,初始化為-1,top就是指向棧頂元素.
	pst->capacity = 0;
}
void  STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}
void  STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity= pst->capacity==0 ? 4 : pst->capacity * 2 ;
		STDataType* tmp = (STDataType*)realloc(pst->a,newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	} 
	pst->a[pst->top] = x;
	pst->top++;
}
STDataType  STTop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	return pst->a[pst->top - 1];
}
bool  STEmpty(ST* pst)
{
	assert(pst);
	return  pst->top == 0;
}
void  STPop(ST* pst)
{
	assert(pst);
	assert(!STEmpty(pst));
	pst->top--;
}
int   STSize(ST* pst)
{
	assert(pst);
	return   pst->top;
}

typedef struct {
  ST  pushst;
  ST  popst;
} MyQueue;


MyQueue* myQueueCreate() {
   MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
   if(obj==NULL)
   {
       perror("malloc fail");
       return;
   }
   STInit(&obj->pushst);
   STInit(&obj->popst);
   return   obj;
}

void myQueuePush(MyQueue* obj, int x) {
   STPush(&obj->pushst,x);
}

int myQueuePop(MyQueue* obj) {
   int  front=myQueuePeek(obj);
   STPop(&obj->popst);
   return  front;
}

int myQueuePeek(MyQueue* obj) {
  if(STEmpty(&obj->popst))
  {
      while(!STEmpty(&obj->pushst))
      {
      STPush(&obj->popst,STTop(&obj->pushst));
      STPop(&obj->pushst);
      }
  }
  return  STTop(&obj->popst);
}

bool myQueueEmpty(MyQueue* obj) {
return  (STEmpty(&obj->pushst))
        &&(STEmpty(&obj->popst));
}

void myQueueFree(MyQueue* obj) {
   STDestroy(&obj->popst);
   STDestroy(&obj->pushst);
   free(obj);
}

2.??題目描述

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??邏輯分析

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??代碼實(shí)現(xiàn)

typedef  int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType  data;
}QNode;
typedef struct  Queue
{
	QNode* phead;
	QNode* ptail;
	int  size;
}Queue;
void  QueueInit(Queue*pq);
void  QueueDestroy(Queue* pq);
void  QueuePush(Queue* pq, QDataType x);
void  QueuePop(Queue* pq);
QDataType  QueueFront(Queue* pq);
QDataType  QueueBack(Queue* pq);
int   QueueSize(Queue* pq);
bool  QueueEmpty(Queue* pq);
void  QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void  QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
		/*QNode* del = cur;
		cur = cur->next;
		free(del);*/
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void  QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		assert(pq->ptail == NULL);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}
void  QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	//1個(gè)結(jié)點(diǎn)
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead =pq->ptail= NULL;     //不能對(duì)同一動(dòng)態(tài)開(kāi)辟出來(lái)的空間進(jìn)行多次free釋放,這里我們釋放完pq->phead之后,pq->ptail也已經(jīng)被釋放了,所以我們主要的目的就是把pq->phead和pq->ptail都置空
	}
	//多個(gè)結(jié)點(diǎn)
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}
QDataType  QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->phead->data;
}
QDataType  QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return  pq->ptail->data;
}
int   QueueSize(Queue* pq)
{
	assert(pq);
	return  pq->size;
}
bool  QueueEmpty(Queue* pq)
{
	assert(pq);
	return  pq->phead == NULL
		&&  pq->ptail == NULL;
}


typedef struct {
   Queue  p;
   Queue  q;
} MyStack;


MyStack* myStackCreate() {
  MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
  if(obj==NULL)
  {
      perror("malloc fail");
      return;
  }
  QueueInit(&obj->p);
  QueueInit(&obj->q);
   return  obj;
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->q))
    {
        QueuePush(&obj->q,x);
    }
    else
    {
        QueuePush(&obj->p,x);
    }
}

int myStackPop(MyStack* obj) {
      Queue* NoFull=&obj->p;
      Queue*  Full=&obj->q;
      if(QueueEmpty(&obj->p))
      {
          Full=&obj->p;
          NoFull=&obj->q;
      }
      while(QueueSize(NoFull)>1)
      {
          QueuePush(Full,QueueFront(NoFull));
          QueuePop(NoFull);
      }
      int top=QueueBack(NoFull);
      QueuePop(NoFull);
      return  top;
}

int myStackTop(MyStack* obj) {
   if(!QueueEmpty(&obj->p))
   {
       return  QueueBack(&obj->p);
   }
   else
   {
        return  QueueBack(&obj->q);
   }
}

bool myStackEmpty(MyStack* obj) {
return   QueueEmpty(&obj->p)
         &&QueueEmpty(&obj->q);
}

void myStackFree(MyStack* obj) {
   QueueDestroy(&obj->p);
   QueueDestroy(&obj->q);
   free(obj);
}

3.??題目描述

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??循環(huán)隊(duì)列

友友們,我們有時(shí)還會(huì)使用一種隊(duì)列叫循環(huán)隊(duì)列。如操作系統(tǒng)課程講解生產(chǎn)者消費(fèi)者模型時(shí)可以就會(huì)使用循環(huán)隊(duì)列。環(huán)形隊(duì)列可以使用數(shù)組實(shí)現(xiàn),也可以使用循環(huán)鏈表實(shí)現(xiàn)。
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??邏輯分析

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

?解決方案

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??友友們注意,這里我們刪除數(shù)據(jù)的時(shí)候不需要抹除數(shù)據(jù),我們只需要把front指針往后移動(dòng)就行,因?yàn)槲覀兪钦J(rèn)為front和rear之間的數(shù)據(jù)為有效的數(shù)據(jù),而且rear的位置是可以存放數(shù)據(jù)的,因?yàn)樗顷?duì)尾數(shù)據(jù)的下一個(gè)位置,所以即使它有數(shù)據(jù),無(wú)論如何我們也訪問(wèn)不到.

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)

??誤區(qū)1(插入刪除數(shù)據(jù)的取模處理)

友友們注意,這里我們?nèi)霐?shù)據(jù)之后,也不能只讓rear++.
隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)
同理,當(dāng)我們刪除數(shù)據(jù)的時(shí)候,也不能只讓front++,我們?cè)诩蛹又笠惨M(jìn)行取模處理.

??誤區(qū)2(訪問(wèn)隊(duì)尾數(shù)據(jù))

隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-469921.html

??代碼實(shí)現(xiàn)

typedef struct {
    int  front;
    int  rear;
    int  k;
    int*a;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
     MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
     obj->a=(int*)malloc(sizeof(int)*(k+1));
     obj->front=obj->rear=0;
     obj->k=k;
     return   obj;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
     return  (obj->rear+1)%(obj->k+1)==obj->front;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
      return  obj->front==obj->rear;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
       if(myCircularQueueIsFull(obj))
       return   false;
       obj->a[obj->rear]=value;
       obj->rear++;
       obj->rear%=(obj->k+1);
       return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
       if(myCircularQueueIsEmpty(obj))
       return  false;
       obj->front++;
       obj->front%=(obj->k+1);
       return  true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
       if(myCircularQueueIsEmpty(obj))
         return   -1;
       return   obj->a[obj->front]; 
}

int myCircularQueueRear(MyCircularQueue* obj) {
     if(myCircularQueueIsEmpty(obj))
        return   -1;
      return  obj->a[(obj->rear+obj->k)%(obj->k+1)];  
}


void myCircularQueueFree(MyCircularQueue* obj) {
     free(obj->a);
     obj->a=NULL;
     free(obj);
}

到了這里,關(guān)于隊(duì)列的實(shí)現(xiàn)(附含三道經(jīng)典例題)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)經(jīng)典題目】—兩個(gè)隊(duì)列實(shí)現(xiàn)棧與兩個(gè)棧實(shí)現(xiàn)隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)經(jīng)典題目】—兩個(gè)隊(duì)列實(shí)現(xiàn)棧與兩個(gè)棧實(shí)現(xiàn)隊(duì)列

    ? ????????????????????????????????????????? 食用指南:本文在有C基礎(chǔ)的情況下食用更佳 ?? ?????????????????????????????????????????? 這就不得不推薦此專欄了: C語(yǔ)言 ??????????????????????????????????????????

    2024年02月13日
    瀏覽(17)
  • 【C語(yǔ)言經(jīng)典例題】——程序員必須會(huì)的經(jīng)典基礎(chǔ)例題(三)

    【C語(yǔ)言經(jīng)典例題】——程序員必須會(huì)的經(jīng)典基礎(chǔ)例題(三)

    關(guān)于C語(yǔ)言的一些基礎(chǔ)經(jīng)典題目放在專欄:[C語(yǔ)言刷題] 小菜坤日常上傳gitee代碼:https://gitee.com/qi-dunyan ??? 個(gè)人簡(jiǎn)介:雙一流非科班的一名小白,期待與各位大佬一起努力! 推薦網(wǎng)站:cplusplus.com 首先我們要知道什么是楊輝三角,如下: 思路: 我們可以看到,三角的兩邊

    2023年04月14日
    瀏覽(775)
  • 空間解析幾何 | 經(jīng)典例題、李林880例題

    空間解析幾何 | 經(jīng)典例題、李林880例題

    旋轉(zhuǎn)曲面:繞哪個(gè)軸轉(zhuǎn) 哪個(gè)分量不變,另外兩個(gè)在題目無(wú)說(shuō)明的情況下寫(xiě)成±另外兩個(gè)分量和開(kāi)平方。 本題即為反求。 ? ? ?直線L的方向向量可以由上下叉乘而來(lái),或者化為對(duì)稱式。 ? ? ? ? ? ? ? ? ? ?僅參考。 ? ? ? ? ? ? ? ?

    2024年02月11日
    瀏覽(20)
  • 【雙指針】滑動(dòng)窗口經(jīng)典例題 力扣

    無(wú)重復(fù)的最長(zhǎng)子串LC3 中等 題目鏈接 給定一個(gè)字符串 s ,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度。 代碼: 找到字符串中所有子母異位詞LC438 中等 題目鏈接 給定兩個(gè)字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序

    2024年02月07日
    瀏覽(24)
  • 微機(jī)原理 || 8253 芯片 (詳細(xì)講解 + 經(jīng)典例題)

    微機(jī)原理 || 8253 芯片 (詳細(xì)講解 + 經(jīng)典例題)

    一點(diǎn)點(diǎn)看!一定可以看懂!考試沒(méi)有問(wèn)題的!加油?? 前面知識(shí)寫(xiě)的詳細(xì),看不懂可以先看 典例 ,回頭來(lái)梳理就明白了【典例就是常考的題】 目錄 Part 1: 芯片知識(shí)總結(jié)? (一)8253 芯片特點(diǎn) (二) 8253芯片引腳功能? ? ??知道才好編程 (三) 8253編程 (1)8253 初始化 ① 工

    2024年02月01日
    瀏覽(27)
  • 算法設(shè)計(jì)與分析-期末復(fù)習(xí)經(jīng)典例題

    算法設(shè)計(jì)與分析-期末復(fù)習(xí)經(jīng)典例題

    算法設(shè)計(jì)應(yīng)滿足的目標(biāo):正確性,可使用,可讀,健壯,高效率,低存儲(chǔ) 算法的5個(gè)重要特征:有限、確定、可行、輸入、輸出 通常用 函數(shù)的返回值 表示算法能否正確執(zhí)行,如果某個(gè)形參需要將執(zhí)行結(jié)果回傳給實(shí)參,需要將該形參設(shè)計(jì)為 引用型參數(shù) 算法分析是分析算法 占

    2024年02月03日
    瀏覽(15)
  • C語(yǔ)言遞歸及經(jīng)典例題詳解

    C語(yǔ)言遞歸及經(jīng)典例題詳解

    ? 什么是遞歸? 什么時(shí)候使用遞歸 例題1 順序打印問(wèn)題 例題2 求n的階乘 例題3 求第n個(gè)斐波那契數(shù) 經(jīng)典 漢諾塔問(wèn)題 經(jīng)典 青蛙跳臺(tái)階問(wèn)題 ? 什么是遞歸? 遞歸就是程序調(diào)用自身的編程技巧。遞歸通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似,規(guī)模較小的問(wèn)題來(lái)求

    2024年02月05日
    瀏覽(21)
  • 有關(guān)C語(yǔ)言指針的經(jīng)典例題

    有關(guān)C語(yǔ)言指針的經(jīng)典例題

    ?1.通過(guò)地址運(yùn)算符獲得地址值 ? 2.輸入a,b,按從小到大的順序輸出 3 3.用指針?lè)ㄔL問(wèn)數(shù)組元素 ?4.從鍵盤輸入10個(gè)整數(shù),放入一堆數(shù)組a中,然后將該數(shù)組中的元素值依次輸出 ?5.將10個(gè)數(shù)的最小值換到最前面的位置 6.求二維數(shù)組元素的最大值 ?7.用指針?lè)▽?shí)現(xiàn)字符串的復(fù)制 8

    2024年02月04日
    瀏覽(17)
  • 【數(shù)學(xué)建?!拷?jīng)典簡(jiǎn)單例題實(shí)例1

    【數(shù)學(xué)建?!拷?jīng)典簡(jiǎn)單例題實(shí)例1

    例1 某人平時(shí)下班總是按預(yù)定時(shí)間到達(dá)某處,然然后他妻子開(kāi)車接他回家。有一天,他比平時(shí)提早了三十分鐘到達(dá)該處,于是此人就沿著他朋友來(lái)接他的方向步行回去并在途中遇到了她,這一天,他比 平時(shí) 提前了十分鐘到家,問(wèn)此人共步行了多長(zhǎng)時(shí)間? 該問(wèn)題求解涉及到對(duì)

    2023年04月21日
    瀏覽(22)
  • 【Verilog】Verilog的八個(gè)經(jīng)典入門例題

    【Verilog】Verilog的八個(gè)經(jīng)典入門例題

    西安電子科技大學(xué)大三上學(xué)期硬件描述語(yǔ)言與可編程邏輯設(shè)計(jì)上機(jī)作業(yè),本文作者采用vivado軟件編譯,Vivado自帶的Simulation工具仿真,效果完全等同于Quartus編譯+Modelsim仿真的組合 提示:以下是本篇文章正文內(nèi)容,提供的程序僅供參考 題目?jī)?nèi)容:設(shè)計(jì)一個(gè)表決器,實(shí)現(xiàn)功能大于

    2024年02月02日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包