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

數(shù)據(jù)結(jié)構(gòu)之棧的實(shí)現(xiàn)(附源碼)

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

目錄

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

?二、棧的實(shí)現(xiàn)

三、初學(xué)棧的練習(xí)題


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

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

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

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

二、棧的實(shí)現(xiàn)

棧的實(shí)現(xiàn)一般可以使用數(shù)組或者鏈表實(shí)現(xiàn),相對(duì)而言數(shù)組的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些。因?yàn)閿?shù)組在尾上插入數(shù)據(jù)的代價(jià)比較小。

數(shù)據(jù)結(jié)構(gòu)之棧的實(shí)現(xiàn)(附源碼),數(shù)據(jù)結(jié)構(gòu)
?

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

#pragma once

//Stack.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
// 支持動(dòng)態(tài)增長(zhǎng)的棧
//使用數(shù)組實(shí)現(xiàn)
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top;		// 棧頂
	int _capacity;  // 容量 
}Stack;
// 初始化棧 
void StackInit(Stack* ps);
// 入棧 
void StackPush(Stack* ps, STDataType data);
// 出棧 
void StackPop(Stack* ps);
// 獲取棧頂元素 
STDataType StackTop(Stack* ps);
// 獲取棧中有效元素個(gè)數(shù) 
int StackSize(Stack* ps);
// 檢測(cè)棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
int StackEmpty(Stack* ps);
// 銷(xiāo)毀棧 
void StackDestroy(Stack* ps);
//Stack.c
#include "Stack.h"

void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_top = 0;
	ps->_capacity = 0;
}

void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//容量滿了
	if (ps->_capacity == ps->_top)
	{
		//如果數(shù)組的容量為0,就賦值為4,;如果數(shù)組的容量不為0且容量滿了,就擴(kuò)大為原來(lái)容量的二倍。
		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] = data;
	ps->_top++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	ps->_top--;
}

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	return ps->_a[ps->_top - 1];
}

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

int StackEmpty(Stack* ps)
{
	return ps->_top;
}

void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}
test.c
#include "Stack.h"

void test01()
{
	Stack st;
	StackInit(&st);

	StackPush(&st, 1);
	StackPush(&st, 2);
	StackPush(&st, 3);
	StackPush(&st, 4);
	StackPush(&st, 5);

	while (StackEmpty(&st))
	{
		printf("%d ", StackTop(&st));
		StackPop(&st);
	}
	printf("\n");

	StackDestroy(&st);
}

int main()
{
	test01();

	return 0;
}

三、初學(xué)棧的練習(xí)題

題1:

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

有效字符串需滿足:

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

?思路:當(dāng)輸入的字符串中出現(xiàn)左括號(hào)時(shí)就進(jìn)棧,出現(xiàn)右括號(hào)時(shí)就與棧頂?shù)淖罄ㄌ?hào)看是否相匹配。若相匹配就棧頂?shù)淖罄ㄌ?hào)出棧,不匹配就直接返回false。若所有左右括號(hào)都匹配才返回true。

具體實(shí)現(xiàn)代碼如下(C語(yǔ)言實(shí)現(xiàn)):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731422.html

//C語(yǔ)言實(shí)現(xiàn)需要自己將棧的各個(gè)功能實(shí)現(xiàn)
typedef char STDataType;

typedef struct Stack
{
	STDataType* _a;
	int _top;		// 棧頂
	int _capacity;  // 容量 
}Stack;

void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_top = 0;
	ps->_capacity = 0;
}

void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	if (ps->_capacity == ps->_top)
	{
		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] = data;
	ps->_top++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	ps->_top--;
}

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);
	return ps->_a[ps->_top - 1];
}

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}

int StackEmpty(Stack* ps)
{
	return ps->_top;
}

void StackDestroy(Stack* ps)
{
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}


bool isValid(char * s)
{
    Stack st;
    StackInit(&st);
    char topVal;
    while(*s)
    {
        //左括號(hào)入棧
        if(*s == '(' || *s == '[' || *s == '{')
        {
            StackPush(&st, *s);
        }
        //右括號(hào)與棧頂左括號(hào)進(jìn)行匹配
        else
        {
            //棧里已經(jīng)沒(méi)有左括號(hào)了,再輸入一個(gè)右括號(hào),不匹配。
            if(StackEmpty(&st) == 0)
            {
                StackDestroy(&st);
                return false;
            }
            topVal = StackTop(&st);
            //不匹配返回false。
            if((topVal == '(' && *s != ')') || (topVal == '[' && *s != ']')
            || (topVal == '{' && *s != '}'))
            {
                StackDestroy(&st);
                return false;
            }
            //匹配成功棧頂出棧。
            StackPop(&st);
        }
        s++;
    }
    //最后棧里還剩有左括號(hào)返回false,不剩返回true。
    int ret = StackEmpty(&st);
    if(ret == 0)
    return true;
    else
    return false;
}

?

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

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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)文章

  • 數(shù)據(jù)結(jié)構(gòu):棧的概念及棧的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu):棧的概念及棧的實(shí)現(xiàn)

    目錄 1.棧的概念及結(jié)構(gòu) 2.棧的實(shí)現(xiàn)? 2.1??初始化棧 2.2?入棧? 2.3?出棧? 2.4?獲取棧頂元素 2.5?獲取棧中有效元素個(gè)數(shù)? ?2.6??檢測(cè)棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 2.7?銷(xiāo)毀棧? 3. 完整代碼 test.c ?Stack.h Stack.c ? 棧(后進(jìn)先出,先進(jìn)后出) : 一種 特殊

    2024年02月01日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu) 棧的概念及棧的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu) 棧的概念及棧的實(shí)現(xiàn)

    目錄 1.棧的概念及結(jié)構(gòu) 2.棧的實(shí)現(xiàn)? 2.1??初始化棧 2.2?入棧? 2.3?出棧? 2.4?獲取棧頂元素 2.5?獲取棧中有效元素個(gè)數(shù)? ?2.6??檢測(cè)棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 2.7?銷(xiāo)毀棧? 3. 完整代碼 test.c ?Stack.h Stack.c ? 棧(后進(jìn)先出,先進(jìn)后出) : 一種 特殊

    2024年01月21日
    瀏覽(14)
  • 【數(shù)據(jù)結(jié)構(gòu)】:棧的實(shí)現(xiàn)

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

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

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

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

    前言 一、什么是棧? 二、 棧的實(shí)現(xiàn) 1. 棧的結(jié)構(gòu) 2. 棧的接口實(shí)現(xiàn)過(guò)程 總結(jié) 棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧,它是

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

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

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

    2024年02月05日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧的實(shí)現(xiàn)

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

    棧:是一種受限制的線性表,即只能在尾部進(jìn)行插入、刪除的線性表,而且是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。尾部這一端又叫做棧頂,另一端叫做棧底。 入棧:向一個(gè)棧內(nèi)插入元素叫做入?;驂簵?,它把新元素放到棧頂元素的上面,是它成為新的棧頂元素。 出棧:在棧內(nèi)刪除元

    2024年02月01日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu):棧的實(shí)現(xiàn)(C實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu):棧的實(shí)現(xiàn)(C實(shí)現(xiàn))

    個(gè)人主頁(yè) : 個(gè)人主頁(yè) 個(gè)人專(zhuān)欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語(yǔ)言》 棧:一種特殊的線性結(jié)構(gòu),其只允許在一端進(jìn)行插入,刪除數(shù)據(jù)。允許操作數(shù)據(jù)的一端被稱為 棧頂 ,另一端被稱為 棧底 。 本篇博客將要實(shí)現(xiàn)的是 數(shù)組棧 。 對(duì)于棧的特殊性,用數(shù)組(在數(shù)組尾部插入刪除數(shù)據(jù)) 和

    2024年02月13日
    瀏覽(38)
  • 【數(shù)據(jù)結(jié)構(gòu)—棧的實(shí)現(xiàn)(數(shù)組棧)】

    【數(shù)據(jù)結(jié)構(gòu)—棧的實(shí)現(xiàn)(數(shù)組棧)】

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、棧 1.1棧的概念及結(jié)構(gòu) 二、棧的實(shí)現(xiàn) 2.1頭文件的實(shí)現(xiàn)—Stack.h 2.2源文件的實(shí)現(xiàn)—Stack.c 2.3源文件的測(cè)試—test.c 三、棧的實(shí)際測(cè)試數(shù)據(jù)展示 3.1正常的出入棧展示: 3.2進(jìn)棧同時(shí)也在出棧的

    2024年02月04日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu):線性表(棧的實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu):線性表(棧的實(shí)現(xiàn))

    棧(Stack)是只允許在一端進(jìn)行插入或刪除操作的線性表.首先棧是一種線性表,但限定這種線性表只能在某一端進(jìn)行插入和刪除操作. 進(jìn)行 數(shù)據(jù)插入和刪除操作的一端 叫 棧頂 ,另一端稱為 棧底 . 棧中的元素遵循 后進(jìn)先出 LIFO(Last In First Out)的原則 壓棧 :棧的插入操作叫做進(jìn)棧/壓棧

    2024年02月09日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧的實(shí)現(xiàn)(C語(yǔ)言)

    【數(shù)據(jù)結(jié)構(gòu)】棧的實(shí)現(xiàn)(C語(yǔ)言)

    文章目錄 1.棧 1.1 棧的定義 1.2 C語(yǔ)言實(shí)現(xiàn)棧 1.2.1接口函數(shù) 1.2.2棧的創(chuàng)建 1.2.3棧的初始化? 1.2.4棧的銷(xiāo)毀 1.2.5壓棧 1.2.6出棧 1.2.7判斷棧是否為空 1.2.8取棧頂元素 1.2.9?棧有多少個(gè)數(shù)據(jù) ?1.3 C語(yǔ)言實(shí)現(xiàn)棧的具體代碼 頭文件stack.h 接口函數(shù)stack.c 測(cè)試函數(shù)test.c ? ? ? ? 棧(stack)又名堆

    2024年02月05日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包