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

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

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

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

個人主頁 : 個人主頁
個人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》


前言

棧:一種特殊的線性結(jié)構(gòu),其只允許在一端進(jìn)行插入,刪除數(shù)據(jù)。允許操作數(shù)據(jù)的一端被稱為棧頂,另一端被稱為棧底。
本篇博客將要實(shí)現(xiàn)的是數(shù)組棧。


一、棧的實(shí)現(xiàn)思路

對于棧的特殊性,用數(shù)組(在數(shù)組尾部插入刪除數(shù)據(jù)) 和 鏈表(頭插頭刪數(shù)據(jù))實(shí)現(xiàn)棧的時間復(fù)雜度都是O(1),難度不大。
數(shù)組棧的優(yōu)劣
優(yōu)

  • 數(shù)組支持隨機(jī)訪問(用下標(biāo)訪問數(shù)據(jù)),許多算法需要隨機(jī)訪問的支持,如二分法…
  • 緩存利用率高

  • 空間不夠時要擴(kuò)容
  • 有時會造成空間浪費(fèi)

1. 結(jié)構(gòu)的定義

棧的結(jié)構(gòu)非常簡單
一個指向動態(tài)開辟空間的指針,一個記錄實(shí)際空間大小的變量,一個記錄棧頂元素的下標(biāo)即可。

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

typedef int STDataType;

typedef struct Stack
{
	STDataType* data;
	int top;//棧頂下標(biāo)
	int capacity;//空間大小
}Stack;

2. 初始化棧(StackInit)

data指針指向動態(tài)開辟的空間,capacity記錄此時空間大小,top置為0。

  • top 置0,表示棧頂數(shù)據(jù)將要插入的位置。
  • top 置-1,表示此時棧頂數(shù)據(jù)的位置。

這里,采用top 置0。

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

//初始化棧

#define SIZE 4

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

	ps->data = (STDataType*)malloc(sizeof(STDataType) * SIZE);
	if (ps->data == NULL)
	{
		perror("malloc");
		exit(-1);
	}

	ps->top = 0;
	ps->capacity = SIZE;
}

3. 入棧(StackPush)

因為top初始化為0,所以直接在top下標(biāo)處入數(shù)據(jù)即可。但要注意,在入數(shù)據(jù)前要檢查容量,如果top == capacity 要擴(kuò)容。

  • 此處檢查容量的操作,可以封裝成一個函數(shù),但沒必要,因為棧的操作只有入棧要檢查容量,其它的操作并不需要檢查容量,封裝成一個函數(shù)反而效率減低了(函數(shù)的調(diào)用要形成函數(shù)棧幀)。

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

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

	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * (ps->capacity * 2));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		ps->data = tmp;
		ps->capacity *= 2;
	}

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

4. 出棧(StackPop)

top 表示的是棧頂數(shù)據(jù)將要入棧的位置,那么出棧操作,只需要讓top 減 1即可。(下次入棧數(shù)據(jù)會直接覆蓋)
但要注意,top = 0 時,表示棧內(nèi)沒有數(shù)據(jù),不能進(jìn)行出棧操作。

  • 出棧操作不能獲取數(shù)據(jù)

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

//出棧
void StackPop(Stack* ps)
{
	assert(ps);
	assert(ps->top != 0);

	ps->top--;
}

5. 獲取棧頂元素(StackTop)

top 指向的是數(shù)據(jù)將要入棧的位置,也就是棧頂數(shù)據(jù)的下一個位置。
那么要獲取棧頂數(shù)據(jù),只需要讀取top - 1處即可。但要注意,如果top = 0,那么top - 1 = -1,會越界訪問,所以top = 0 時,不能獲取棧頂元素。

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


//獲取棧頂元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->top > 0);
	
	return ps->data[ps->top - 1];
}

6. 檢查棧是否為空(StackEmpty)

top 指向的是數(shù)據(jù)將要入棧的位置,其數(shù)值也表示棧內(nèi)數(shù)據(jù)個數(shù)。
所以我們只需要進(jìn)行 top == 0 的判斷,即可知道棧是否為空。

//檢查棧是否為空
bool StackEmpty(Stack* ps)
{
	assert(ps);

	return ps->top == 0;
}

7. 銷毀棧(StackDestroy)

free掉動態(tài)開辟的空間,使capacity 置 0,top 置 0。

//銷毀棧
void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->top = 0;
	ps->capacity = 0;
}

二、代碼實(shí)現(xiàn)

Stack.h 文件存放的是函數(shù)的聲明,頭文件的引用,結(jié)構(gòu)體的定義
Stack.c 文件存放的是函數(shù)的實(shí)現(xiàn)

//Stack.h  文件

#pragma once

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

#define SIZE 4

typedef int STDataType;

typedef struct Stack
{
	STDataType* data;
	int top;
	int capacity;
}Stack;


//初始化棧
void StackInit(Stack* ps);

//入棧
void StackPush(Stack* ps, STDataType x);

//出棧
void StackPop(Stack* ps);

//獲取棧頂元素
STDataType StackTop(Stack* ps);

//檢查棧是否為空
bool StackEmpty(Stack* ps);

//銷毀棧
void StackDestroy(Stack* ps);


//Stack.c  文件


#include "Stack.h"

//初始化棧
void StackInit(Stack* ps)
{
	assert(ps);

	ps->data = (STDataType*)malloc(sizeof(STDataType) * SIZE);
	if (ps->data == NULL)
	{
		perror("malloc");
		exit(-1);
	}

	ps->top = 0;
	ps->capacity = SIZE;
}


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

	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * (ps->capacity * 2));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		ps->data = tmp;
		ps->capacity *= 2;
	}

	ps->data[ps->top] = x;
	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->data[ps->top - 1];
}


//檢查棧是否為空
bool StackEmpty(Stack* ps)
{
	assert(ps);

	return ps->top == 0;
}



//銷毀棧
void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->top = 0;
	ps->capacity = 0;
}

總結(jié)

以上就是我對于棧的實(shí)現(xiàn)。
數(shù)據(jù)結(jié)構(gòu):棧的實(shí)現(xiàn)(C實(shí)現(xiàn)),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),c語言,算法文章來源地址http://www.zghlxwxcb.cn/news/detail-642710.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):棧的實(shí)現(xiàn)(C實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】棧的講解

    【數(shù)據(jù)結(jié)構(gòu)與算法】棧的講解

    棧(stack)是限定僅在表尾進(jìn)行插入和刪除操作的線性表。 我們把 允許插入和刪除的一段稱為棧頂(top) , 另一端稱為棧底 , 不含任何數(shù)據(jù)元素的棧稱為空棧 。 棧又稱為后進(jìn)先出的線性表 。 進(jìn)一步理解棧,棧首先他是一個 線性表 ,所以棧元素具有前驅(qū)后繼關(guān)系。 棧的插入操

    2023年04月08日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】鏈棧的基本操作(C語言)

    零零總總搜索了一些關(guān)于鏈棧的資料,了解了鏈棧的基本操作,一直覺得別人寫的代碼或多或少存在一些問題,所以打算自己寫一篇關(guān)于鏈棧的文章,也算是對所學(xué)知識的梳理和鞏固了。 首先說明本文使用C語言進(jìn)行鏈棧的基本操作,鏈棧是無頭結(jié)點(diǎn)的。這里補(bǔ)充說明一下,

    2024年02月05日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 鏈棧的基本操作 (C語言版)

    目錄 一、鏈棧 1、鏈棧的定義: 2、鏈棧的優(yōu)缺點(diǎn): 二、鏈棧的基本操作算法(C語言)???? 1、宏定義 ??2、創(chuàng)建結(jié)構(gòu)體 3、鏈棧的初始化? ?4、鏈棧的進(jìn)棧 5、鏈棧的出棧 6、獲取棧頂元素 7、棧的遍歷輸出 8、鏈棧的判空 ?9、求鏈棧的棧長 10、鏈棧的清空 11、鏈棧的銷毀

    2024年01月24日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)——C語言對棧的基本操作

    數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)——C語言對棧的基本操作

    ? ? ? ? ?棧(Stack)是一種常用的數(shù)據(jù)結(jié)構(gòu),遵循先進(jìn)后出(LIFO)的原則,對表尾進(jìn)行操作,常用于臨時存儲和撤銷等操作,其基本操作包括棧的創(chuàng)建、入棧(也叫壓棧Push)、出棧(又稱彈棧)、棧的遍歷、棧的清空(clear)、棧的銷毀(destroy)等。 ? ? ? ? 棧的創(chuàng)建有兩種方式,一種是通

    2024年02月07日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

    【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

    親測可行: 使用藍(lán)橋杯比賽編譯器:DEV C++? 求迷宮中從入口到出口的路徑是一個經(jīng)典的程序設(shè)計問題,通常采用“窮舉求解”的方法,即順著某一方向向前探索,若能走通,則繼續(xù)往前走;否則原路返回,換一個方向繼續(xù)探索,直至所有可能的通路都探索到為止。 因此,在

    2024年02月08日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語言版)

    目錄 一、順序棧 1、順序棧的定義: 2、順序棧的優(yōu)缺點(diǎn) 二、順序棧的基本操作算法(C語言)??? 1、宏定義 ?2、創(chuàng)建結(jié)構(gòu)體 3、順序棧的初始化? 4、順序棧的入棧 5、順序棧的出棧 6、取棧頂元素 7、棧的遍歷輸出 8、順序棧的判空 9、順序棧的判滿 ?10、求順序棧長度 11、順

    2024年01月24日
    瀏覽(27)
  • 數(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?獲取棧中有效元素個數(shù)? ?2.6??檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 2.7?銷毀棧? 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?獲取棧中有效元素個數(shù)? ?2.6??檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 2.7?銷毀棧? 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)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包