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

棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列

這篇具有很好參考價值的文章主要介紹了棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

隊列的實現(xiàn)

這里的隊列我們使用鏈?zhǔn)疥犃?,好處就是可以很方便的取出隊頭的元素。
使用順序隊列取出隊頭元素所花費的時間復(fù)雜度為O(N),把后面的元素向前移動一個下標(biāo)所花費的時間。
鏈?zhǔn)疥犃械拇鎯Y(jié)構(gòu):

棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列

typedef int QueueDataType;
//節(jié)點類型
typedef struct QueueNode
{
	QueueDataType data;
	struct QueueNode* next;
}QNode;
//隊列類型
typedef struct Queue
{
	QNode* phead;  //頭指針
	QNode* ptail;  //尾指針   使用頭指針和尾指針來實現(xiàn)隊列的刪除和插入操作。
	int size;
}Que;

接口函數(shù)的實現(xiàn)
`

void QueueInit(Que* pq);
void QueueDestory(Que* pq);
void QueuePush(Que* pq, QueueDataType x);
void QueuePop(Que* pq);
QueueDataType QueueFront(Que* pq);
QueueDataType QueueBack(Que* pq);
int QueueSize(Que* pq);
bool QueueEmpty(Que* pq);

//實現(xiàn)

//初始化隊列
void QueueInit(Que* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

//銷毀隊列,這里相當(dāng)于單鏈表的銷毀,一個節(jié)點一個節(jié)點銷毀
void QueueDestory(Que* pq)
{
	assert(pq);
	//刪除鏈?zhǔn)疥犃?/span>
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
}

//相當(dāng)于單鏈表的尾插,先新建一個節(jié)點,初始化這個節(jié)點,尾插到隊列中,這里考慮兩種情況,隊列為空和不為空的情況
void QueuePush(Que* pq, QueueDataType x)
{
	assert(pq);
	//新建節(jié)點
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc failed!\n");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	//考慮此時的隊列為空
	if (pq->ptail == NULL)
	{
		assert(pq->phead == NULL);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		//不為空時,把newnode賦值給phead->next,然后ptail = newnode
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}
//相當(dāng)于單鏈表的頭刪。需要考慮兩種情況,隊列為空就不可以刪除,隊列不為空只有一個節(jié)點phead和ptail都要賦值成NULL,否則會出現(xiàn)ptail為野指針的情況,多個節(jié)點時,相當(dāng)于單鏈表的頭刪,
void QueuePop(Que* pq)
{
	//相當(dāng)于單鏈表的頭刪
	assert(pq);
	//處理隊列為空的情況
	assert(!QueueEmpty(pq));
	//處理只有一個節(jié)點的情況
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else   //考慮多個節(jié)點的情況
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->size--;
}
QueueDataType QueueFront(Que* pq)
{
	assert(pq);
	//處理隊列為空的情況
	assert(!QueueEmpty(pq));
	return pq->phead->data;
}
//返回隊列的尾部元素,這里會在用隊列實現(xiàn)棧的時候用到
QueueDataType QueueBack(Que* pq)
{
	assert(pq);
	//處理隊列為空的情況
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}
int QueueSize(Que* pq)
{
	assert(pq);
	return pq->size;
}
bool QueueEmpty(Que* pq)
{
	assert(pq);
	return pq->phead == NULL && pq->ptail == NULL;
	//return pq->size == 0;
}

用隊列實現(xiàn)棧

leetcode做題鏈接棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列

主要思想:用兩個隊列來實現(xiàn)一個棧的功能,先進(jìn)后出,后進(jìn)先出的功能,我們可以這樣,在不為空的隊列里入數(shù)據(jù),然后再把數(shù)據(jù)前n-1個數(shù)數(shù)據(jù)倒入另一個隊列中,具體的過程用圖展示:

第一步:準(zhǔn)備兩個隊列,開始入數(shù)據(jù)
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第二步:往不為空的隊列里入數(shù)據(jù),如果兩個都為空,任選一個入數(shù)據(jù)
push 四次。可得隊列中的數(shù)據(jù)如下圖所示:
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第三步:出數(shù)據(jù),需要先把q1中的數(shù)據(jù)1、2、3倒入q2中,然后使用QueueBack()接口獲取隊尾數(shù)據(jù)4。
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
以上就是出數(shù)據(jù)和入數(shù)據(jù)的過程。
具體代碼如下:

typedef struct {
  Que q1;
  Que q2;
} MyStack;


MyStack* myStackCreate() {
   MyStack* obj = (MyStack*)malloc(sizeof(MyStack));
   if(obj == NULL)
   {
       perror("malloc failed!\n");
       return NULL;
   }
   QueueInit(&obj->q1);
   QueueInit(&obj->q2);

   return obj;
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1,x);   //入數(shù)據(jù),往不為空的隊列里如數(shù)據(jù)
    }
    else
    {
        QueuePush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj) {
    //假設(shè)為空
    Que* pEmptyQ = &obj->q1;
    Que* pNonEmptyQ = &obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        pEmptyQ = &obj->q2;
        pNonEmptyQ = &obj->q1;
    }
    //倒數(shù)據(jù),把非空隊列的數(shù)據(jù)導(dǎo)入空隊列,剩余一個就是棧頂元素
    while(QueueSize(pNonEmptyQ)>1)
    {
        QueuePush(pEmptyQ, QueueFront(pNonEmptyQ));
        QueuePop(pNonEmptyQ);
    }
    int top = QueueFront(pNonEmptyQ);
    QueuePop(pNonEmptyQ);
    return top;
}

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

用棧實現(xiàn)隊列

leetcode 做題鏈接
基本思想
使用兩個棧,一個為入數(shù)據(jù)的棧,一個為出數(shù)據(jù)的棧,把數(shù)據(jù)入到入數(shù)據(jù)的棧,然后出數(shù)據(jù)到出數(shù)據(jù)的棧,基本方法如下:入隊列1 2 3 4。
第一步:初始化兩個棧。
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第二步:入數(shù)據(jù)push 1 2 3 4
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第三步:導(dǎo)數(shù)據(jù)到popst中
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第四步:從popst中出數(shù)據(jù)
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
實現(xiàn)代碼如下:

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


MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    if(obj==NULL)
    {
        perror("malloc failed!\n");
        return NULL;
    }
    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) {
    STDestory(&obj->pushst);
    STDestory(&obj->popst);
    free(obj);
}

設(shè)計循環(huán)隊列

leetcode做題鏈接
循環(huán)隊列的要點:如何用一個順序表實現(xiàn)一個循環(huán)隊列,front為隊頭,rear為隊尾,判滿:rear + 1 == front為滿,判空:rear == front 為空。
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第一步,初始化一個隊列,k為5,n為6
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
第二步:出隊列 front++;再入數(shù)據(jù) 6、7。
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
此時的rear,跑到了front的前面,我們可以 讓rear % (k+1)保持rear永遠(yuǎn)不會越界front也可以使用這個公式保證front永遠(yuǎn)不會越界
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列
獲取隊尾元素的兩種方法:
棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列

求元素的個數(shù)的方法: (rear - front + k+1)% (k+1)

具體的實現(xiàn)代碼如下:

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


bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == obj->rear;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear+1)%(obj->k+1) == obj->front;
}
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    if(obj == NULL)
    {
        perror("malloc failed!\n");
        return NULL;
    }
    obj->a = (int*)malloc(sizeof(int)*(k+1));
    if(obj->a == NULL)
    {
        perror("malloc failed!\n");
        return NULL;
    }
    obj->front = obj->rear = 0;
    obj->k = k;
    return obj;
}

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)];
    if(obj->rear==0)
    {
        return obj->a[obj->k];
    }
    else
    {
        return obj->a[obj->rear-1];
    }
}


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

好的我們下一篇再見。文章來源地址http://www.zghlxwxcb.cn/news/detail-512164.html

到了這里,關(guān)于棧和隊列(二) 隊列的實現(xiàn),用棧實現(xiàn)隊列,用隊列實現(xiàn)棧,設(shè)計循環(huán)隊列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 第10天-代碼隨想錄刷題訓(xùn)練-第五章 棧和隊列- ● 理論基礎(chǔ) ● 232.用棧實現(xiàn)隊列 ● 225. 用隊列實現(xiàn)棧

    第10天-代碼隨想錄刷題訓(xùn)練-第五章 棧和隊列- ● 理論基礎(chǔ) ● 232.用棧實現(xiàn)隊列 ● 225. 用隊列實現(xiàn)棧

    棧和隊列對應(yīng)的三個不同的STL版本,底層實現(xiàn)方式不一樣, 為我們所知道的是 SGI STL 棧 棧提供 pop和push等接口, 不提供走訪功能 也不提供迭代器, 不像map和set可以使用迭代器遍歷,往往不被歸類為容器,而是容器適配器 棧的內(nèi)部實現(xiàn)結(jié)構(gòu)可以使用 verctor、list 和 deque(默認(rèn))

    2024年02月04日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列篇| 超清晰圖解和詳解:循環(huán)隊列模擬、用棧實現(xiàn)隊列、用隊列實現(xiàn)棧

    【數(shù)據(jù)結(jié)構(gòu)】隊列篇| 超清晰圖解和詳解:循環(huán)隊列模擬、用棧實現(xiàn)隊列、用隊列實現(xiàn)棧

    博主簡介: 努力學(xué)習(xí)的22級計算機(jī)科學(xué)與技術(shù)本科生一枚?? 博主主頁: @是瑤瑤子啦 每日一言??: 每一個不曾起舞的日子,都是對生命的辜負(fù)?!岵???622. 設(shè)計循環(huán)隊列 ???? 思路: ??數(shù)據(jù)結(jié)構(gòu): 使用數(shù)組為數(shù)據(jù)結(jié)構(gòu),且采用犧牲一個空間的方法來包裝判空和判滿的

    2024年02月11日
    瀏覽(28)
  • 棧和隊列OJ題合集(包含循環(huán)隊列的兩種實現(xiàn))

    棧和隊列OJ題合集(包含循環(huán)隊列的兩種實現(xiàn))

    目錄 一:前言 二:有效的括號(括號匹配) 三:用隊列實現(xiàn)棧 四:用棧實現(xiàn)隊列 五:設(shè)計循環(huán)隊列 對棧和隊列的 基本性質(zhì)和實現(xiàn) 有問題的可以看上一期 ?鏈接: http://t.csdn.cn/YQMBA???? ?注意:本文用數(shù)據(jù)的大小來表示入棧入隊的先后。 題目鏈接:https://leetcode.cn/problems/valid-paren

    2023年04月15日
    瀏覽(15)
  • 關(guān)于用棧和隊列分別解決走迷宮問題的方法討論(參與者:陳卓,毛敏磊)

    關(guān)于用棧和隊列分別解決走迷宮問題的方法討論(參與者:陳卓,毛敏磊)

    對于生活中最常見的小游戲——走迷宮,相信大家都不陌生,人為走相信大家都會走,但能不能用代碼實現(xiàn),我們認(rèn)為是可以的,以下是我們對如何走迷宮的一些看法和代碼實現(xiàn)(cz負(fù)責(zé)隊列解決,mml負(fù)責(zé)用棧解決) 先簡單介紹一下 隊列 :隊列是一種操作受限的線性表,只

    2024年04月08日
    瀏覽(20)
  • 第 3 章 棧和隊列 (循環(huán)隊列)

    第 3 章 棧和隊列 (循環(huán)隊列)

    1. 背景說明 和順序棧相類似,在隊列的順序存儲結(jié)構(gòu)中,除了用一組地址連續(xù)的存儲單元依次存放從隊列頭到隊列尾的元素之外, 尚需附設(shè)兩個指針 front 和 rear 分別指示隊列頭元素及隊列尾元素的位置。約定:初始化建空隊列時,令 fronts = rear = 0, 每當(dāng)插入新的隊列尾元素

    2024年02月10日
    瀏覽(14)
  • 數(shù)據(jù)結(jié)構(gòu):循環(huán)隊列的實現(xiàn)(leetcode622.設(shè)計循環(huán)隊列)

    數(shù)據(jù)結(jié)構(gòu):循環(huán)隊列的實現(xiàn)(leetcode622.設(shè)計循環(huán)隊列)

    ? 目錄 一.循環(huán)隊列簡單介紹 二.用靜態(tài)數(shù)組實現(xiàn)循環(huán)隊列 1.數(shù)組循環(huán)隊列結(jié)構(gòu)設(shè)計 2.數(shù)組循環(huán)隊列的堆區(qū)內(nèi)存申請接口? 3.數(shù)據(jù)出隊和入隊的接口實現(xiàn) 4.其他操作接口 5.數(shù)組循環(huán)隊列的實現(xiàn)代碼總覽? 三.靜態(tài)單向循環(huán)鏈表實現(xiàn)循環(huán)隊列? 1.鏈表循環(huán)隊列的結(jié)構(gòu)設(shè)計 2.創(chuàng)建靜態(tài)

    2024年02月03日
    瀏覽(21)
  • 【用隊列實現(xiàn)?!俊居脳崿F(xiàn)隊列】Leetcode 232 225

    【用隊列實現(xiàn)?!俊居脳崿F(xiàn)隊列】Leetcode 232 225

    ---------------????題目鏈接 用隊列實現(xiàn)棧????------------------- ---------------????題目鏈接 用棧實現(xiàn)隊列????-------------------

    2024年01月20日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】用棧實現(xiàn)隊列

    【數(shù)據(jù)結(jié)構(gòu)】用棧實現(xiàn)隊列

    前言:本節(jié)博客分享了用棧實現(xiàn)隊列效果的思路以及代碼,有需要借鑒即可。 LINK 如果要用棧實現(xiàn)隊列,我們直到棧是先入后出的一個效果,所以我們可以用兩個棧,這樣逆轉(zhuǎn)兩次數(shù)不就是入棧之前數(shù)組的順序嘛。下面是一些圖輔助理解: 完。

    2024年03月10日
    瀏覽(59)
  • 【leetcode】232. 用棧實現(xiàn)隊列

    【leetcode】232. 用棧實現(xiàn)隊列

    1.使用兩個棧結(jié)構(gòu)構(gòu)建隊列 我們需要自定義棧及其相關(guān)操作 棧結(jié)構(gòu)遵循后入先出的原則,隊列結(jié)構(gòu)遵循先入先出的原則 構(gòu)建具有兩個棧結(jié)構(gòu)的隊列,棧pushST用于數(shù)據(jù)的插入,棧popST用于數(shù)據(jù)的刪除 為棧結(jié)構(gòu)動態(tài)開辟空間并初始化棧結(jié)構(gòu) 2.入隊操作 模擬入隊操作,即將所有元

    2024年02月12日
    瀏覽(20)
  • leetcode 232.用棧實現(xiàn)隊列

    leetcode 232.用棧實現(xiàn)隊列

    ?? leetcode鏈接:用棧實現(xiàn)隊列 1?? 思路和圖解: push: pop: peek: 和 pop 類似。 代碼: ? 棧和隊列相關(guān)接口代碼(可復(fù)制): 【數(shù)據(jù)結(jié)構(gòu)】棧和隊列

    2024年02月13日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包