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

手撕數(shù)據(jù)結(jié)構(gòu)之棧+例題

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

目錄

一、棧的概念及結(jié)構(gòu)

二、棧的頭文件及基本框架

三、接口實(shí)現(xiàn)

1、對(duì)棧的初始化

?2、棧的銷毀

3、入棧操作

4、出棧操作

?5、判斷棧是否為空

6、返回棧頂元素

7、遍歷棧

四、有效的括號(hào) - 力扣(LeetCode)

題目描述:

?思路:

代碼:


一、棧的概念及結(jié)構(gòu)

棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出的原則。

如同子彈夾,我們進(jìn)行添子彈和出子彈,很形象。

壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧,入數(shù)據(jù)在棧頂。

出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)也在棧頂。

手撕數(shù)據(jù)結(jié)構(gòu)之棧+例題,C語言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,棧

?接下來,我們以數(shù)組棧的形式去模擬。

二、棧的頭文件及基本框架

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

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;//就是以a開頭的一段連續(xù)的空間
	int top;//定義棧頂位置
	int capacity;
}ST;

void SLInit(ST* ps);
void SLDestroy(ST* ps);
void STPush(ST* ps, STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);
STDataType STTop(ST* ps);//獲取棧頂元素

三、接口實(shí)現(xiàn)

1、對(duì)棧的初始化

void SLInit(ST* ps)
{
	ST* ret = (ST*)malloc(4 * sizeof(ST));
	if (ret == NULL)
	{
		perror(malloc);
		exit(-1);
	}
	ps->a = ret;
	ps->capacity = 4;
	ps->top = 0;
}

?2、棧的銷毀

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

3、入棧操作

void STPush(ST* ps, STDataType x)
{
	assert(ps != NULL);
	//檢查需不需要擴(kuò)容
	if (ps->top == ps->capacity)
	{
		ps->capacity += 4;
		ST* ret = (ST*)realloc( ps->a, sizeof(ST) * ps->capacity);
		if (ret == NULL)
		{
			perror(realloc);
			exit(-1);
		}
		ps->a = ret;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

4、出棧操作

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

?5、判斷棧是否為空

bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
    如果右邊等式成立返回true,反之返回false
}

6、返回棧頂元素

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

7、遍歷棧

不同于其他數(shù)據(jù)結(jié)構(gòu),遍歷棧不用print

//遍歷棧的特殊方式
	while (!STEmpty(&ps))
	{
		printf("%d ", STTop(&ps));
		STPop(&ps);
	}

四、有效的括號(hào) - 力扣(LeetCode)

題目描述:

給定一個(gè)只包括?'(',')','{''}','[',']'?的字符串?s?,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號(hào)必須用相同類型的右括號(hào)閉合。
  2. 左括號(hào)必須以正確的順序閉合。
  3. 每個(gè)右括號(hào)都有一個(gè)對(duì)應(yīng)的相同類型的左括號(hào)。

手撕數(shù)據(jù)結(jié)構(gòu)之棧+例題,C語言,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,棧

?思路:

如果是左括號(hào)就入棧,如果是右括號(hào)就與棧頂元素進(jìn)行比較。這樣就正好匹配題目的要求,但博主目前沒有學(xué)過STL庫,所以只能將上面的手撕棧CV一下啦,下面的代碼為了避免冗余去除掉這一部分~文章來源地址http://www.zghlxwxcb.cn/news/detail-644513.html

代碼:

bool isValid(char * s)
{
    char* ret = s;
    int num = 0;
    //利用奇數(shù)偶數(shù)判斷數(shù)量是否匹配
    while(*ret)
    {
        num++;
        ret++;
    }
    if(num%2 != 0)
    {
        return false;
    }
    ST ps;
	SLInit(&ps);
    while(*s)
    {
    switch(*s)
    {
        case '{':
        case '[':
        case '(':
            STPush(&ps,*s);
            break;
        case ')':
        case ']':
        case '}':
            if(STSize(&ps) == 0)
                return false;
            if(*s == ']' && STTop(&ps) != '['||
               *s == ')' && STTop(&ps) != '('||
               *s == '}' && STTop(&ps) != '{')
            {
                SLDestroy(&ps);
                return false;
            }
            STPop(&ps);
            break;
    }
    s++;
    }
    //防止((出現(xiàn)
    if(!STEmpty(&ps))
        return false;
    return true;
}

到了這里,關(guān)于手撕數(shù)據(jù)結(jié)構(gòu)之棧+例題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?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)載,請(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)文章

  • 追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——C語言手撕八大經(jīng)典排序

    追夢(mèng)之旅【數(shù)據(jù)結(jié)構(gòu)篇】——C語言手撕八大經(jīng)典排序

    ? ? ??博客昵稱:博客小夢(mèng) ??最喜歡的座右銘:全神貫注的上吧?。。???作者簡介:一名熱愛C/C++,算法等技術(shù)、喜愛運(yùn)動(dòng)、熱愛K歌、敢于追夢(mèng)的小博主! ??博主小留言:哈嘍! ??各位CSDN的uu們,我是你的博客好友小夢(mèng),希望我的文章可以給您帶來一定的幫助,話不

    2024年02月17日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)入門(C語言版)一篇文章教會(huì)你手撕八大排序

    數(shù)據(jù)結(jié)構(gòu)入門(C語言版)一篇文章教會(huì)你手撕八大排序

    排序 :所謂排序,就是使一串記錄,按照其中的某個(gè)或某些的大小,遞增或遞減的排列起來的操作。 穩(wěn)定性 :假定在待排序的記錄序列中,存在多個(gè)具有相同的的記錄,若經(jīng)過排序,這些記錄的相對(duì)次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而

    2024年02月01日
    瀏覽(23)
  • 《數(shù)據(jù)結(jié)構(gòu)與算法》之棧結(jié)構(gòu)

    《數(shù)據(jù)結(jié)構(gòu)與算法》之棧結(jié)構(gòu)

    在計(jì)算機(jī)發(fā)明之初是為了計(jì)算,所以叫計(jì)算機(jī),對(duì)我們給定的一個(gè)算式,然后給定的一套規(guī)則 加,減,乘,除,等,它就可以自己進(jìn)行計(jì)算了,然后返回一個(gè)結(jié)果給我們 對(duì)于一般的算式 : 2+3+4 很顯然,從左往右依次掃描,依次相加很簡單的計(jì)算出來,因?yàn)樗鼈兪峭?jí)運(yùn)算,

    2024年02月06日
    瀏覽(28)
  • [C語言實(shí)現(xiàn)]數(shù)據(jù)結(jié)構(gòu)——手撕順序棧之我出生就會(huì)寫一個(gè)棧

    [C語言實(shí)現(xiàn)]數(shù)據(jù)結(jié)構(gòu)——手撕順序棧之我出生就會(huì)寫一個(gè)棧

    ??作者: FlashRider ??專欄: 數(shù)據(jù)結(jié)構(gòu) 目錄 棧的前置知識(shí) 1.什么是棧? 2.生活中哪些地方有棧的影子? 順序表實(shí)現(xiàn)棧 1.為什么通常采用順序表實(shí)現(xiàn)棧? 2.棧的實(shí)現(xiàn) 棧( stack )又名堆棧,它是一種 運(yùn)算受限的線性表 。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為

    2024年02月08日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)之棧

    棧是限定僅在表尾進(jìn)行插入和刪除操作的線性表,又稱為后進(jìn)先出(last in first out)的線性表(LIFO結(jié)構(gòu)),表尾稱為棧頂,表頭稱為棧底,不含元素則稱為空棧; 抽象數(shù)據(jù)類型 : 其中base為NULL時(shí)表示棧結(jié)構(gòu)不存在,top==base可作為棧空的標(biāo)記; InitStack GetTop Push Pop 測試 鏈?zhǔn)酱鎯?chǔ)便于多

    2024年02月05日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(四)

    數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列——算法與數(shù)據(jù)結(jié)構(gòu)入門筆記(四)

    本文是算法與數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)筆記第四篇,將持續(xù)更新,歡迎小伙伴們閱讀學(xué)習(xí) 。有不懂的或錯(cuò)誤的地方,歡迎交流 棧是一種線性數(shù)據(jù)結(jié)構(gòu),其 只允許在固定的一端進(jìn)行插入和刪除 元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂 (Top), 另一端稱為棧底 (Bottom)。棧中的

    2024年02月08日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列

    數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列

    ??數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計(jì)的重要基礎(chǔ),它所討論的內(nèi)容和技術(shù)對(duì)從事軟件項(xiàng)目的開發(fā)有重要作用。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)要達(dá)到的目標(biāo)是學(xué)會(huì)從問題出發(fā),分析和研究計(jì)算機(jī)加工的數(shù)據(jù)的特性,以便為應(yīng)用所涉及的數(shù)據(jù)選擇適當(dāng)?shù)倪壿嫿Y(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)及其相應(yīng)的操作方法,為提高利用

    2024年01月22日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)】線性表之棧、隊(duì)列

    前面兩篇文章講述了關(guān)于線性表中的順序表與鏈表,這篇文章繼續(xù)講述線性表中的 棧和隊(duì)列。 這里講述的兩種線性表與前面的線性表不同,只允許在一端入數(shù)據(jù),一段出數(shù)據(jù),詳細(xì)內(nèi)容請(qǐng)看下面的文章。 順序表與鏈表兩篇文章的鏈接: 線性表之順序表 線性表之鏈表 注意:

    2024年02月06日
    瀏覽(94)
  • 《數(shù)據(jù)結(jié)構(gòu)》之棧和堆結(jié)構(gòu)及JVM簡析

    《數(shù)據(jù)結(jié)構(gòu)》之棧和堆結(jié)構(gòu)及JVM簡析

    在數(shù)據(jù)結(jié)構(gòu)中,我們第一了解到了?;蚨褩?,它的結(jié)構(gòu)特點(diǎn)是什么呢?先進(jìn)后出,它的特點(diǎn)有什么用呢?我們?cè)谀睦锟梢允褂玫綏=Y(jié)構(gòu),棧結(jié)構(gòu)那么簡單,使用這么久了為什么不用其它結(jié)構(gòu)替代? 作為一個(gè)程序猿,我們應(yīng)該會(huì)常常跟代碼打交道,那么我們所編寫的程序或代碼

    2024年02月07日
    瀏覽(34)
  • 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列詳解

    數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列詳解

    棧和隊(duì)列是一種特殊的線性結(jié)構(gòu),他與之前學(xué)的線性結(jié)構(gòu)不同,棧和隊(duì)列是擁有一種特殊規(guī)則的線性結(jié)構(gòu),雖然它是用數(shù)組或者鏈表實(shí)現(xiàn),但是只有符合這種規(guī)則才能被稱作?;蛘哧?duì)列 棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和

    2024年01月16日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包