国产 无码 综合区,色欲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鏈接:232. 用棧實現(xiàn)隊列 - 力扣(LeetCode)

注:本文默認讀者已掌握棧與隊列的基本操作

可以看這篇文章熟悉知識點:【數(shù)據(jù)結(jié)構(gòu)】棧與隊列_字節(jié)連結(jié)的博客-CSDN博客

目錄

做題思路

代碼實現(xiàn)

1. MyQueue

2. myQueueCreate

3. myQueuePush

4. myQueuePeek

5. myQueuePop

6. myQueueEmpty

7. myQueueFree

全部代碼


做題思路

簡單來說,就是把一個棧(棧1)的數(shù)據(jù)捯入另一個棧(棧2),此時(棧2)出數(shù)據(jù)的順序就和隊列是一樣的。

為了更方便理解,我會畫圖來演示一下具體思路。

我們需要兩個棧來實現(xiàn)隊列:

  • push棧:專門入數(shù)據(jù)的棧
  • pop棧:專門出數(shù)據(jù)的棧

如下圖:

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

插入數(shù)據(jù):直接在push棧內(nèi)插入即可

push棧內(nèi)插入數(shù)據(jù):1、2、3、4、5

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

刪除數(shù)據(jù):需要把push棧內(nèi)的數(shù)據(jù)捯入pop棧

  • 棧是后入先出的
  • 當push棧的數(shù)據(jù)捯入pop棧后,數(shù)據(jù)順序會改變

如下圖:

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

可以看到數(shù)據(jù)順序逆轉(zhuǎn)了

但是的這些操作跟隊列有什么聯(lián)系呢?

不妨來看看pop棧隊列的對比:

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

由此可見:pop棧出數(shù)據(jù)的順序是和隊列一樣的

到這里思路已經(jīng)很清晰了:我們需要兩個棧,一個專門用來push,一個專門用來pop,捯數(shù)據(jù)后,pop棧出數(shù)據(jù)的順序就跟隊列是一樣的。

那么如何用代碼(C)來實現(xiàn)這個思路呢?


代碼實現(xiàn)

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

所以先把之前模擬實現(xiàn)過的棧復(fù)制過來:

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

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化棧
void STInit(ST* ps);
//銷毀棧
void STDestroy(ST* ps);
//入棧
void STPush(ST* ps, STDataType x);
//出棧
void STPop(ST* ps);
//獲取棧頂元素
STDataType STTop(ST* ps);
//獲取棧中有效元素個數(shù)
int STSize(ST* ps);
//檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
bool STEmpty(ST* ps);

void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newCapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

復(fù)制完成之后就是本題的重點內(nèi)容了。

本題要求:

實現(xiàn)?MyQueue?類:

  • void push(int x)?將元素 x 推到隊列的末尾
  • int pop()?從隊列的開頭移除并返回元素
  • int peek()?返回隊列開頭的元素
  • boolean empty()?如果隊列為空,返回?true?;否則,返回?false

1. MyQueue

由于我們是用兩個棧實現(xiàn)隊列

所以這里需要定義兩個棧

//兩個棧模擬實現(xiàn)隊列
typedef struct
{
    ST pushst;
    ST popst;
} MyQueue;

2. myQueueCreate

這個函數(shù)要求我們開辟空間,并初始化棧

//開辟空間并初始化
MyQueue* myQueueCreate()
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->pushst);
    STInit(&obj->popst);
    return obj;
}

3. myQueuePush

直接把數(shù)據(jù)插入到push棧即可

//將元素X推到隊列的末尾
void myQueuePush(MyQueue* obj, int x)
{
    STPush(&obj->pushst, x);
}

4. myQueuePeek

本函數(shù)要求返回隊列開頭的元素

  • 如果pop棧為空:要把push棧的數(shù)據(jù)捯入pop棧才能找到隊列的首元素
  • 如果pop棧不為空:pop棧的棧頂元素就是隊列的首元素

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

//返回隊列開頭的元素
int myQueuePeek(MyQueue* obj)
{
    if (STEmpty(&obj->popst))
    {
        //捯數(shù)據(jù)
        while (!STEmpty(&obj->pushst))
        {
            STPush(&obj->popst, STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }
    return STTop(&obj->popst);
}

5. myQueuePop

  • 要求刪除隊頭元素,也就是pop棧的棧頂元素,直接刪除即可
  • 并且要返回隊頭元素的值,需要先定義一個臨時變量來保存隊頭元素的值
  • 最后返回這個臨時變量
//從隊列的開頭移除并返回元素
int myQueuePop(MyQueue* obj)
{
    int front = myQueuePeek(obj);
    STPop(&obj->popst);
    return front;
}

6. myQueueEmpty

判斷隊列是否為空,返回一個bool值(true/false)

如果push棧pop棧都為空,則說明隊列為空

//如果隊列為空,返回true;否則,返回false
bool myQueueEmpty(MyQueue* obj)
{
    return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}

7. myQueueFree

銷毀隊列

  • 銷毀push棧pop棧
  • 釋放動態(tài)開辟的空間
//銷毀隊列
void myQueueFree(MyQueue* obj)
{
    STDestroy(&obj->popst);
    STDestroy(&obj->pushst);
    free(obj);
}

到這里全部函數(shù)已經(jīng)實現(xiàn)完畢,提交代碼:

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

成功通過

下面我會把本題的全部代碼整合在一起發(fā)出來


全部代碼

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

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化棧
void STInit(ST* ps);
//銷毀棧
void STDestroy(ST* ps);
//入棧
void STPush(ST* ps, STDataType x);
//出棧
void STPop(ST* ps);
//獲取棧頂元素
STDataType STTop(ST* ps);
//獲取棧中有效元素個數(shù)
int STSize(ST* ps);
//檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
bool STEmpty(ST* ps);

void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newCapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

STDataType STTop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	return ps->a[ps->top - 1];
}

int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

//=======================================================================

//兩個棧模擬實現(xiàn)隊列
typedef struct
{
    ST pushst;
    ST popst;
} MyQueue;

//開辟空間并初始化
MyQueue* myQueueCreate()
{
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->pushst);
    STInit(&obj->popst);
    return obj;
}

//將元素X推到隊列的末尾
void myQueuePush(MyQueue* obj, int x)
{
    STPush(&obj->pushst, x);
}

//返回隊列開頭的元素
int myQueuePeek(MyQueue* obj)
{
    if (STEmpty(&obj->popst))
    {
        //捯數(shù)據(jù)
        while (!STEmpty(&obj->pushst))
        {
            STPush(&obj->popst, STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }
    return STTop(&obj->popst);
}

//從隊列的開頭移除并返回元素
int myQueuePop(MyQueue* obj)
{
    int front = myQueuePeek(obj);
    STPop(&obj->popst);
    return front;
}

//如果隊列為空,返回true;否則,返回false
bool myQueueEmpty(MyQueue* obj)
{
    return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}

//銷毀隊列
void myQueueFree(MyQueue* obj)
{
    STDestroy(&obj->popst);
    STDestroy(&obj->pushst);
    free(obj);
}

本文完文章來源地址http://www.zghlxwxcb.cn/news/detail-677259.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),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之棧與隊列的實現(xiàn)與詳細解析

    個人主頁:點我進入主頁 專欄分類:C語言初階? ? ??C語言程序設(shè)計————KTV? ? ? ?C語言小游戲? ? ?C語言進階 C語言刷題? ? ? ?數(shù)據(jù)結(jié)構(gòu)初階 歡迎大家點贊,評論,收藏。 一起努力,一起奔赴大廠。 目錄 1.前言 2.棧 2.1棧的概念與性質(zhì) 2.2棧的實現(xiàn) 3.隊列 3.1隊列的概

    2024年02月05日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)-如何實現(xiàn)一個隊列?逐步解析與代碼示例(超詳細)

    數(shù)據(jù)結(jié)構(gòu)-如何實現(xiàn)一個隊列?逐步解析與代碼示例(超詳細)

    在計算機科學(xué)中,隊列是一種非?;A(chǔ)且廣泛使用的數(shù)據(jù)結(jié)構(gòu)。它的工作原理類似于現(xiàn)實生活中的排隊:先來的先服務(wù)(FIFO, First-In-First-Out)。在本文中,我們將深入探討如何在C語言中使用鏈表實現(xiàn)一個隊列,并解析相關(guān)的代碼實現(xiàn)。 隊列是一種遵循先進先出原則的線性數(shù)

    2024年02月03日
    瀏覽(13)
  • 數(shù)據(jù)結(jié)構(gòu):圖文詳解 隊列 | 循環(huán)隊列 的各種操作(出隊,入隊,獲取隊列元素,判斷隊列狀態(tài))

    數(shù)據(jù)結(jié)構(gòu):圖文詳解 隊列 | 循環(huán)隊列 的各種操作(出隊,入隊,獲取隊列元素,判斷隊列狀態(tài))

    目錄 隊列的概念 隊列的數(shù)據(jù)結(jié)構(gòu) 隊列的實現(xiàn) 入隊 出隊 獲取隊頭元素 獲取隊列長度 循環(huán)隊列的概念 循環(huán)隊列的數(shù)據(jù)結(jié)構(gòu) 循環(huán)隊列的實現(xiàn) 判斷隊列是否為空 判斷隊列是否已滿 入隊 出隊 得到隊頭元素 得到隊尾元素 隊列(Queue)是一種數(shù)據(jù)結(jié)構(gòu),是一種 先進先出 (First-

    2024年02月04日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】移除鏈表元素-圖文解析(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】移除鏈表元素-圖文解析(單鏈表OJ題)

    LeetCode鏈接:203. 移除鏈表元素 - 力扣(LeetCode) 本文導(dǎo)航 ??做題思路 ??畫圖更好理解: ??代碼實現(xiàn) ???分情況討論: ??極端情況: 遍歷鏈表,找到值為 val 的節(jié)點刪除 這里需要兩個指針 ?cur 用來遍歷鏈表 ?prev 指向 cur 的前一個位置,方便刪除一個節(jié)點后,鏈接前

    2024年02月14日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列及其實現(xiàn)

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

    目錄 ??前言 認識隊列 隊列的初始化 隊列判空 數(shù)據(jù)隊尾入隊 數(shù)據(jù)隊頭出隊 取隊頭數(shù)據(jù) 取隊尾數(shù)據(jù) 隊列數(shù)據(jù)的個數(shù) 隊列銷毀 總結(jié) 上次我們學(xué)習(xí)了棧及其實現(xiàn),當然也少不它的好兄弟隊列啦,今天我們開始隊列的學(xué)習(xí) 隊列的性質(zhì)是 先進先出 ,就比如車輛進出隧道一般,它

    2024年02月09日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)隊列的實現(xiàn)

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

    本章介紹數(shù)據(jù)結(jié)構(gòu)隊列的內(nèi)容,我們會從隊列的定義以及使用和OJ題來了解隊列,話不多說,我們來實現(xiàn)吧 隊列 1。隊列的概念及結(jié)構(gòu) 隊列:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out) 入隊列:進行插入

    2024年02月11日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列的實現(xiàn)

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

    隊列是一種常用的數(shù)據(jù)結(jié)構(gòu),也是一種操作受限制的線性表,特點是只允許在表的頭部進行刪除操作,在表的尾部進行插入操作,隊列具有先進先出FIFO(First In First Out)。 入隊列:進行插入操作的一端稱為隊尾 出隊列:進行刪除操作的一端稱為隊頭 我們實現(xiàn)可以用數(shù)組和鏈表

    2024年02月02日
    瀏覽(40)
  • 數(shù)據(jù)結(jié)構(gòu)—隊列的實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)—隊列的實現(xiàn)

    前言:上次我們已經(jīng)學(xué)習(xí)了數(shù)據(jù)結(jié)構(gòu)中一個重要的線性表—棧,那么我們這一次就來學(xué)習(xí)另外一個重要的線性表—隊列。 一、 隊列的概念 二、 隊列的實現(xiàn): 1.隊列的創(chuàng)建 三、 隊列的操作 1.初始化隊列 2.隊尾入隊列 3.隊頭出隊列 4.獲取隊列頭部元素 5.獲取隊列隊尾元素 6.獲

    2024年02月04日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)---隊列的實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)---隊列的實現(xiàn)

    前言 一、什么是隊列? 二、 隊列接口的實現(xiàn) 1. 隊列結(jié)構(gòu)的定義 2. 接口實現(xiàn) 總結(jié) 隊列是一種特殊的線性表。 特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。 進行插入操作的端稱為

    2024年02月02日
    瀏覽(16)
  • 【數(shù)據(jù)結(jié)構(gòu)】:隊列的實現(xiàn)

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

    隊列:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out) 入隊列:進行插入操作的一端稱為隊尾 出隊列:進行刪除操作的一端稱為隊頭 隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如

    2024年02月07日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包