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

【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列]

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

【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列],# 玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型,leetcode,數(shù)據(jù)結(jié)構(gòu),算法

所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型??
?? >博主首頁:初陽785??
?? >代碼托管:chuyang785??
?? >感謝大家的支持,您的點(diǎn)贊和關(guān)注是對我最大的支持?。?!??
?? >博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文?。??
?? >關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說三遍?。。。。。。?!??
??????????????????????????????????????????????????

?? 1.題目來源

LeetCode用棧實(shí)現(xiàn)隊(duì)列
??注意:本題涉及到有關(guān)數(shù)據(jù)結(jié)構(gòu)——隊(duì)列和棧,這兩章節(jié)的知識點(diǎn),如有小伙伴還不熟棧的,可以先復(fù)習(xí)復(fù)習(xí)一下有關(guān)棧的相關(guān)知識,復(fù)習(xí)的地方我也提供了哦??,所用到的知識點(diǎn)——棧,所用到的知識點(diǎn)——隊(duì)列
??注意:同樣的本題是使用純C語言實(shí)現(xiàn)的.

??2.題目描述

請你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、pop、peek、empty):
實(shí)現(xiàn) MyQueue 類:
1.void push(int x) 將元素 x 推到隊(duì)列的末尾
2.int pop() 從隊(duì)列的開頭移除并返回元素
3.int peek() 返回隊(duì)列開頭的元素
4.boolean empty() 如果隊(duì)列為空,返回 true ;否則,返回 false

??說明:

  • 你 只能 使用標(biāo)準(zhǔn)的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊(duì)列)來模擬一個(gè)棧,只要是標(biāo)準(zhǔn)的棧操作即可。

【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列],# 玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型,leetcode,數(shù)據(jù)結(jié)構(gòu),算法

??3.解題思路

  • 從題目要求我們知道,要用兩個(gè)棧列實(shí)現(xiàn)隊(duì)列的功能,也就是使用的是棧,??但是實(shí)現(xiàn)的效果時(shí)隊(duì)列的效果。
  • 開始做題之前我們首要的是明白隊(duì)列和棧的特點(diǎn)。這里我們就簡單的提一下,具體的知識請看上述給的鏈接。??隊(duì)列——隊(duì)列的特性是??先進(jìn)的先出,就跟食堂打飯一樣,先到的先打飯,打完飯就可以走了。?!獥5奶匦允??先進(jìn)的后出,就跟我們在桌子上疊書一樣,想要拿到最底下的書就要先把最上面的書先拿走。
  • 首先隊(duì)列的插入和棧的插入都是一樣的,都是尾插,所以push這個(gè)動(dòng)作并不難,關(guān)鍵是棧的刪除是尾刪,而隊(duì)列的刪除時(shí)頭刪,那怎么樣才能使用兩個(gè)棧實(shí)現(xiàn)刪除頭上的數(shù)據(jù)呢。既然棧是尾刪,能不能把存放進(jìn)去的數(shù)據(jù)反過來,這樣雖然棧進(jìn)行的是尾刪,但是刪除的是頭上的數(shù)據(jù),也就相當(dāng)于是頭刪一樣了。
  • ??那么我們的思路肯定是這樣的:兩個(gè)棧,首先第一次存放數(shù)據(jù)的時(shí)候,??隨便找一個(gè)棧粗放數(shù)據(jù),假設(shè)放的是1,2,3,4,5頭數(shù)據(jù)是1,尾數(shù)據(jù)是5,等到要?jiǎng)h除的時(shí)候通過找到尾的方式把數(shù)據(jù)一一放到另一個(gè)棧中,這樣另一個(gè)棧的數(shù)據(jù)就是5,4,3,2,1了,這個(gè)時(shí)候頭數(shù)據(jù)就是5,尾數(shù)據(jù)就是1了,Pop的時(shí)候就是Pop尾數(shù)據(jù)1,也就是插入時(shí)的頭數(shù)據(jù),這樣就實(shí)現(xiàn)頭刪??。而如果還要繼續(xù)存放數(shù)據(jù)的時(shí)候就把數(shù)據(jù)按照上面同樣的操作把數(shù)據(jù)重新放回去,也就是2,3,4,5,然后繼續(xù)在后面放數(shù)據(jù),要?jiǎng)h除的時(shí)候再重復(fù)第一次的操作即可。那么問題來了,從上述分析我們知道了兩個(gè)棧,一個(gè)棧是用來存放數(shù)據(jù)進(jìn)去的棧我們命名為Spush,一個(gè)是用來刪除數(shù)據(jù)的棧Spop,而且我們每次還要繼續(xù)放數(shù)據(jù)的是由都要把數(shù)據(jù)從Spop中把數(shù)據(jù)放回Spush,然后進(jìn)行追加數(shù)據(jù)???,但是這一步真的有必要嗎???其實(shí)并不需要這兩個(gè)棧就只需要完成一個(gè)push另一個(gè)pop就行了,追加數(shù)據(jù)的時(shí)候也不需要把數(shù)據(jù)從Spop中重新放回Spush中,只需要等Spop中數(shù)據(jù)被刪除完后,再從Spush中導(dǎo)入即可。

【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列],# 玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型,leetcode,數(shù)據(jù)結(jié)構(gòu),算法
【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列],# 玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型,leetcode,數(shù)據(jù)結(jié)構(gòu),算法

  • 所以總上所述,我們的兩個(gè)棧,每一棧復(fù)雜特定的功能,一個(gè)負(fù)責(zé)push數(shù)據(jù),一個(gè)用來pop數(shù)據(jù)

  • ??同時(shí)解釋一下我們oj刷題的時(shí)出現(xiàn)的一些一些疑問


typedef struct {

} MyQueue;

MyQueue* myQueueCreate() {

}

這個(gè)是我們題目出現(xiàn)的函數(shù)接口,我來解釋一下表示什么意思。文章來源地址http://www.zghlxwxcb.cn/news/detail-635811.html

  1. 題目已經(jīng)明確我們要使用兩個(gè)棧來實(shí)現(xiàn)隊(duì)列,所有我們就得創(chuàng)建兩個(gè)棧的,而我們通常遇到這種兩個(gè)及以上的要使用的成員時(shí),??為了減少傳遞的參數(shù),以及代碼的可讀性,簡潔性,??我們通常會(huì)用一個(gè)結(jié)構(gòu)體把他們封裝起來,所以我們的上述結(jié)構(gòu)體就是用來創(chuàng)建兩個(gè)棧的,并且這個(gè)結(jié)構(gòu)體還是個(gè)匿名結(jié)構(gòu)體,匿名結(jié)構(gòu)體的特點(diǎn)就是只能用一次,這里我們只需要使用一次即可,所以匿名合理。
  2. 而另一個(gè)函數(shù)接口是用來初始化我們的結(jié)構(gòu)體的,并返回結(jié)構(gòu)體指針。??

??4.代碼展示

//棧函數(shù)接口
typedef int STDataType;
typedef struct Stack
{
	STDataType* data;
	int capaciyt;
	int size;
}Stack;

void StackInit(Stack* ps);

void StackDestroy(Stack* ps);

void StackPush(Stack* ps, STDataType x);

void StackPop(Stack* ps);

STDataType StackTop(Stack* ps);

bool StackEmpt(Stack* ps);

int StackSize(Stack* ps);

void StackInit(Stack* ps)
{
	assert(ps);
	ps->data = NULL;
	ps->capaciyt = 0;
	ps->size = 0;
}

void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->data = NULL;
	ps->capaciyt = ps->size = 0;
}

void StackPush(Stack* ps, STDataType x)
{
	assert(ps);

	if (ps->size == ps->capaciyt)
	{
		int newCapacity = ps->capaciyt == 0 ? 4 : ps->capaciyt * 2;
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->data = tmp;
		ps->capaciyt = newCapacity;
	}

	ps->data[ps->size] = x;
	ps->size++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	ps->size--;
}

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	return ps->data[ps->size - 1];
}

bool StackEmpt(Stack* ps)
{
	assert(ps);

	return ps->size == 0;
}

int StackSize(Stack* ps)
{
	assert(ps);

	return ps->size;
}

//函數(shù)實(shí)現(xiàn)
typedef struct {
    Stack Spush;
    Stack Spop;
} MyQueue;

MyQueue* myQueueCreate() {
    MyQueue* ret = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&ret->Spush);
    StackInit(&ret->Spop);

    return ret;
}

//這里我把Peek函數(shù)放到了前面,考慮到后面的Pop也會(huì)用到類似的功能,直接服用Peek就行了
int myQueuePeek(MyQueue* obj) {
    //為空導(dǎo)入數(shù)據(jù)
    if (StackEmpt(&obj->Spop))
    {
        while (!StackEmpt(&obj->Spush))
        {
            StackPush(&obj->Spop,StackTop(&obj->Spush));
            StackPop(&obj->Spush);
        }
    }
    return StackTop(&obj->Spop);
}

void myQueuePush(MyQueue* obj, int x) {
    //直接再Spush中插入數(shù)據(jù)
    StackPush(&obj->Spush,x);
}

int myQueuePop(MyQueue* obj) {
    //服用Peek,如果Spop為空,就從Spush中導(dǎo)入數(shù)據(jù)
   int ret = myQueuePeek(obj);
   StackPop(&obj->Spop);
   return ret;
}

bool myQueueEmpty(MyQueue* obj) {
    //兩個(gè)為空才為空
    return StackEmpt(&obj->Spop) && StackEmpt(&obj->Spush);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->Spop);
    StackDestroy(&obj->Spush);

    free(obj);
}

到了這里,關(guān)于【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(12)[用棧實(shí)現(xiàn)隊(duì)列]的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】用棧實(shí)現(xiàn)括號匹配

    【數(shù)據(jù)結(jié)構(gòu)】用棧實(shí)現(xiàn)括號匹配

    1.創(chuàng)立一個(gè)判斷括號是否匹配的函數(shù)BracketsCheck 2.傳參(棧,輸入的字符串) 3.對字符串中的(、[、{、這三種括號進(jìn)行匹配 4.順序從左往右進(jìn)行,依次將符合條件的括號放入棧中,滿足FILO原則 5.但拿到右括號時(shí)進(jìn)行匹配,如果匹配成功,那么就出棧,如果失敗就返回false 定義

    2024年02月06日
    瀏覽(23)
  • 【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(6)[回文鏈表]

    【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(6)[回文鏈表]

    所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型 博主首頁:初陽785 代碼托管:chuyang785 感謝大家的支持,您的點(diǎn)贊和關(guān)注是對我最大的支持?。?! 博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文??! 關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說三遍?。。。。。。。?回文鏈表 給定一個(gè)鏈表的 頭節(jié)點(diǎn)

    2024年02月03日
    瀏覽(21)
  • 【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(5)[分割鏈表]

    【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(5)[分割鏈表]

    所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型 博主首頁:初陽785 代碼托管:chuyang785 感謝大家的支持,您的點(diǎn)贊和關(guān)注是對我最大的支持?。。?博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文??! 關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說三遍?。。。。。。?! 分割鏈表 給你一個(gè)鏈表的頭節(jié)點(diǎn)

    2024年02月04日
    瀏覽(26)
  • 【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(13)[設(shè)計(jì)循環(huán)鏈表]

    【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(13)[設(shè)計(jì)循環(huán)鏈表]

    所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型?? ?? 博主首頁:初陽785?? ?? 代碼托管:chuyang785?? ?? 感謝大家的支持,您的點(diǎn)贊和關(guān)注是對我最大的支持!??!?? ?? 博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文??!?? ?? 關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說三遍?。。。?!

    2024年02月13日
    瀏覽(23)
  • C語言數(shù)據(jù)結(jié)構(gòu)篇——用棧實(shí)現(xiàn)四則運(yùn)算

    C語言數(shù)據(jù)結(jié)構(gòu)篇——用棧實(shí)現(xiàn)四則運(yùn)算

    作者名:Demo不是emo? 主頁面鏈接: 主頁傳送門 創(chuàng)作初心: 舞臺再大,你不上臺,永遠(yuǎn)是觀眾,沒人會(huì)關(guān)心你努不努力,摔的痛不痛,他們只會(huì)看你最后站在什么位置,然后羨慕或鄙夷 座右銘: 不要讓時(shí)代的悲哀成為你的悲哀 專研方向: 網(wǎng)絡(luò)安全,數(shù)據(jù)結(jié)構(gòu) 每日emo: 我愛

    2024年02月09日
    瀏覽(41)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】7、隊(duì)列(Queue)的實(shí)現(xiàn)【用棧實(shí)現(xiàn)隊(duì)列】

    【數(shù)據(jù)結(jié)構(gòu)與算法】7、隊(duì)列(Queue)的實(shí)現(xiàn)【用棧實(shí)現(xiàn)隊(duì)列】

    ?? 隊(duì)列 (Queue)是一種特殊的 線性表 , 只能在頭尾兩端進(jìn)行操作 ?? 隊(duì)尾(rear):只能從 隊(duì)尾添加 元素,一般叫做 enQueue , 入隊(duì) ?? 隊(duì)頭(front):只能從 隊(duì)頭移除 元素,一般叫做 deQueue , 出隊(duì) ?? 先進(jìn)先出 的原則, F irst I n F irst O ut, FIFO ?? 隊(duì)列內(nèi)部的實(shí)現(xiàn)可

    2024年02月12日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列&&設(shè)計(jì)循環(huán)隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)與算法】用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列&&設(shè)計(jì)循環(huán)隊(duì)列

    ?? 作者:@ 阿亮joy. ?? 專欄:《數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué)》 ?? 座右銘:每個(gè)優(yōu)秀的人都有一段沉默的時(shí)光,那段時(shí)光是付出了很多努力卻得不到結(jié)果的日子,我們把它叫做扎根 請你僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、

    2024年01月20日
    瀏覽(26)
  • 《數(shù)據(jù)結(jié)構(gòu)初階》用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列的細(xì)致解析

    《數(shù)據(jù)結(jié)構(gòu)初階》用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列的細(xì)致解析

    目錄 一、??本章重點(diǎn) 二、??隊(duì)列實(shí)現(xiàn)棧 三、??棧實(shí)現(xiàn)隊(duì)列 四、??解題思路總結(jié) 用兩個(gè)隊(duì)列實(shí)現(xiàn)棧 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列 解題思路總結(jié) ?我們有兩個(gè)隊(duì)列: ?入棧數(shù)據(jù)1、 2、 3 可以將數(shù)據(jù)入隊(duì)列至隊(duì)列一或者隊(duì)列二。 如何出棧? ?但出棧要先出1,怎么辦? 第一步 :

    2023年04月25日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)刷題訓(xùn)練:用棧實(shí)現(xiàn)隊(duì)列(力扣OJ)

    數(shù)據(jù)結(jié)構(gòu)刷題訓(xùn)練:用棧實(shí)現(xiàn)隊(duì)列(力扣OJ)

    目錄 前言 1. 題目:用棧實(shí)現(xiàn)隊(duì)列 2. 思路 3. 分析 ?3.1 定義 “ 隊(duì)列 ” ?3.2 創(chuàng)建隊(duì)列 3.3 入隊(duì) ?3.4 隊(duì)頭數(shù)據(jù) ?3.5 出隊(duì) ?3.6 判空和銷毀 4.題解 總結(jié) ????????棧和隊(duì)列是數(shù)據(jù)結(jié)構(gòu)中的兩個(gè)重要概念,它們在算法和程序設(shè)計(jì)中都有著廣泛的應(yīng)用。本文將帶你深入了解如何使用

    2024年02月13日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)-進(jìn)制轉(zhuǎn)換】用棧實(shí)現(xiàn)10進(jìn)制數(shù)轉(zhuǎn)任意進(jìn)制數(shù)

    【數(shù)據(jù)結(jié)構(gòu)-進(jìn)制轉(zhuǎn)換】用棧實(shí)現(xiàn)10進(jìn)制數(shù)轉(zhuǎn)任意進(jìn)制數(shù)

    用棧實(shí)現(xiàn)10進(jìn)制數(shù)轉(zhuǎn)任意進(jìn)制數(shù)代碼實(shí)現(xiàn) 主要思想 :一個(gè)十進(jìn)制數(shù)轉(zhuǎn)成相應(yīng)進(jìn)制,是通過自身除于對應(yīng)進(jìn)制得余數(shù),直到商為0.將所有余數(shù)逆序(即最先得到的余數(shù)放最后面)排列,得到的結(jié)果為所得相應(yīng)進(jìn)制數(shù)。這一特性與棧極其類似,棧也是 先進(jìn)后出 原則,故用棧更為

    2023年04月08日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包