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

【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,leetcode

LeetCode鏈接:225. 用隊列實現(xiàn)棧 - 力扣(LeetCode)


本文默認讀者已經(jīng)掌握棧與隊列的基本知識

或者先看我的另一篇博客:【數(shù)據(jù)結(jié)構(gòu)】棧與隊列_字節(jié)連結(jié)的博客-CSDN博客

做題思路

由于我們使用的是C語言,不能直接使用隊列的操作,

所以做這道題得先把我們之前實現(xiàn)的隊列復(fù)制過來:

//C語言模擬實現(xiàn)隊列


//鏈?zhǔn)浇Y(jié)構(gòu):表示隊列
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

//隊列的結(jié)構(gòu)
typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Que;

//初始化隊列
void QueueInit(Que* pq);
//銷毀隊列
void QueueDestroy(Que* pq);
//隊尾入隊列
void QueuePush(Que* pq, QDataType x);
//隊頭出隊列
void QueuePop(Que* pq);
//獲取隊列頭部元素
QDataType QueueFront(Que* pq);
//獲取隊列隊尾元素
QDataType QueueBack(Que* pq);
//檢測隊列是否為空,如果為空返回非零結(jié)果,如果非空返回0
bool QueueEmpty(Que* pq);
//獲取隊列中有效元素個數(shù)
int QueueSize(Que* pq);

void QueueInit(Que* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

void QueueDestroy(Que* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

void QueuePush(Que* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->tail == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

void QueuePop(Que* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}
	pq->size--;
}

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

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

bool QueueEmpty(Que* pq)
{
	assert(pq);
	return pq->head == NULL;
}

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

復(fù)制完成后進入正題:

【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,leetcode

答:用兩個隊列捯數(shù)據(jù)的方式來實現(xiàn)后入先出的棧

圖文解析:

【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,leetcode

代碼:

//用兩個隊列實現(xiàn)棧
typedef struct
{
    Que q1;//隊列1
    Que q2;//隊列2
} MyStack;

//開辟空間并初始化
MyStack* myStackCreate()
{
    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
    QueueInit(&pst->q1);
    QueueInit(&pst->q2);
	return pst;
}

//將元素x壓入棧頂
void myStackPush(MyStack* obj, int x)
{
    if (!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1, x);
    }
    else
    {
        QueuePush(&obj->q2, x);
    }
}

//移除并返回棧頂元素
int myStackPop(MyStack* obj)
{
    Que* empty = &obj->q1;
    Que* nonEmpty = &obj->q2;
    if (!QueueEmpty(&obj->q1))
    {
        nonEmpty = &obj->q1;
        empty = &obj->q2;
    }
    //前size-1個導(dǎo)入空隊列
    while (QueueSize(nonEmpty) > 1)
    {
        QueuePush(empty, QueueFront(nonEmpty));
        QueuePop(nonEmpty);
    }
    //用局部變量記錄棧頂元素,方便返回
    int top = QueueFront(nonEmpty);
    QueuePop(nonEmpty);
    return top;
}

//返回棧頂元素
int myStackTop(MyStack* obj)
{
    if (!QueueEmpty(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

//如果棧是空的,返回true;否則,返回false
bool myStackEmpty(MyStack* obj)
{
    return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

//銷毀棧
void myStackFree(MyStack* obj)
{
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}

提交代碼:

【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,leetcode

成功通過


本文完文章來源地址http://www.zghlxwxcb.cn/news/detail-661268.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】如何用隊列實現(xiàn)棧?圖文詳解(LeetCode)的文章就介紹完了。如果您還想了解更多內(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īng)查實,立即刪除!

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

相關(guān)文章

  • 【算法與數(shù)據(jù)結(jié)構(gòu)】隊列的實現(xiàn)詳解

    【算法與數(shù)據(jù)結(jié)構(gòu)】隊列的實現(xiàn)詳解

    隊列的概念: 隊列:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO(First In First Out) 新添加的元素添加到隊尾,只能從隊頭取出元素。 入隊列:進行插入操作的一端稱為隊尾 出隊列:進行刪除操作的一端稱為隊頭 隊列特征如

    2024年04月13日
    瀏覽(35)
  • 【數(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級計算機科學(xué)與技術(shù)本科生一枚?? 博主主頁: @是瑤瑤子啦 每日一言??: 每一個不曾起舞的日子,都是對生命的辜負?!岵???622. 設(shè)計循環(huán)隊列 ???? 思路: ??數(shù)據(jù)結(jié)構(gòu): 使用數(shù)組為數(shù)據(jù)結(jié)構(gòu),且采用犧牲一個空間的方法來包裝判空和判滿的

    2024年02月11日
    瀏覽(28)
  • (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    本章將會詳細講解以下知識點: 目錄 一:棧 ? ? ? ? 1:棧的定義,棧的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)棧與原因的分析? ? ? ? ??3:? (超詳解)棧的常用接口并且附上測試用例 二:隊列 ? ? ? ? 1:隊列的定義,隊列的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)隊列與原因的分析

    2024年02月11日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列實現(xiàn)+層序遍歷詳解+一些練題

    【數(shù)據(jù)結(jié)構(gòu)】隊列實現(xiàn)+層序遍歷詳解+一些練題

    歡迎來到我的: 世界 希望作者的文章對你有所幫助,有不足的地方還請指正,大家一起學(xué)習(xí)交流 ! 國慶到了,也要內(nèi)卷一下,感謝所以老鐵們的支持!?? 1、隊列的定義 隊列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。 隊列是一種先進先出(

    2024年02月08日
    瀏覽(13)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    前面我們學(xué)習(xí)了隊列的順序表的實現(xiàn),本節(jié)將用單鏈表實現(xiàn)隊列。 隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn), 使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結(jié)構(gòu),出隊列在數(shù)組頭上出數(shù)據(jù),效率會比較低 。下面我們先復(fù)習(xí)一下隊列的基本概念: 隊列:只允許在一端進行插入

    2024年04月11日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)】如何設(shè)計循環(huán)隊列?圖文解析(LeetCode)

    【數(shù)據(jù)結(jié)構(gòu)】如何設(shè)計循環(huán)隊列?圖文解析(LeetCode)

    LeetCode鏈接:622. 設(shè)計循環(huán)隊列 - 力扣(LeetCode) 目錄 做題思路 只開辟 k 個空間 多開一個空間 代碼實現(xiàn) 1. 循環(huán)隊列的結(jié)構(gòu) 2. 開辟空間 3. 判斷空 4. 判斷滿 5. 隊尾插入數(shù)據(jù) 6. 隊頭刪除數(shù)據(jù) 7. 獲取隊頭元素 8. 獲取隊尾元素 9. 銷毀隊列 全部代碼 設(shè)計循環(huán)隊列,使用數(shù)組或鏈表

    2024年02月10日
    瀏覽(23)
  • 『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』? - 堆的概念&&實現(xiàn)(圖文詳解+完整源碼)

    『初階數(shù)據(jù)結(jié)構(gòu) ? C語言』? - 堆的概念&&實現(xiàn)(圖文詳解+完整源碼)

    目錄 0.寫在前面 1.什么是堆? 2.堆的實現(xiàn) 2.1 堆的結(jié)構(gòu)定義 2.2 函數(shù)聲明 2.3 函數(shù)實現(xiàn) 2.3.1 AdjustUp(向上調(diào)整算法) 2.3.2 AdjustDown(向下調(diào)整算法) 2.3.3 HeapCreate(如何建堆) 2.3.4 建堆的時間復(fù)雜度 3.?完整源碼 Heap.h文件 Heap.c文件? Test.c文件? 上一章中介紹了樹和二叉樹的概念

    2024年02月16日
    瀏覽(23)
  • C++數(shù)據(jù)結(jié)構(gòu)與算法詳解:鏈表、棧、隊列、樹、二叉樹和圖結(jié)構(gòu)的實現(xiàn)與應(yīng)用

    鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu)由一系列節(jié)點按順序連接而成,一般每個節(jié)點包含一個數(shù)據(jù)元素和一個指向下一個節(jié)點的引用。 鏈表有多種類型: 單向鏈表:每個節(jié)點只有一個指向下一個節(jié)點的引用 雙向鏈表:每個節(jié)點有一個指向前一個節(jié)點和一個指向后一個節(jié)點的引用 循環(huán)鏈

    2024年02月04日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】詳解環(huán)形隊列

    【數(shù)據(jù)結(jié)構(gòu)】詳解環(huán)形隊列

    隊列的操作算法是筆試面試中較為常見的題目。 本文將著重介紹平時面試中常見的關(guān)于隊列的應(yīng)用題目,馬上要進行秋招了。希望對你們有幫助 _?? 設(shè)計你的循環(huán)隊列實現(xiàn)。 循環(huán)隊列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進先出)原則并且隊尾被連接在隊首之后以

    2024年02月10日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)——循環(huán)隊列詳解

    數(shù)據(jù)結(jié)構(gòu)——循環(huán)隊列詳解

    目錄 一、循環(huán)隊列的定義 二、 循環(huán)隊列的基本操作 三、循環(huán)隊列的實現(xiàn)? 1、循環(huán)隊列的定義 2、循環(huán)隊列的初始化? 3、循環(huán)隊列出隊? 4、循環(huán)隊列入隊? 5、隊列判空 6、 隊列判滿 7、取隊頭元素 8、輸出隊列? 9、求隊列長度? 四、完整代碼? 五、小結(jié)? 六、參考文獻 一、

    2024年02月04日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包