最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)數(shù)組棧的代碼示例

 更新時間:2024年07月28日 09:59:34   作者:池央  
棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作,進行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底,本文給大家介紹了C語言實現(xiàn)數(shù)組棧的代碼示例,需要的朋友可以參考下

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

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

棧的定義

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;//數(shù)組
	int _top; // 棧頂,類似順序表中的_size
	int _capacity; // 容量
}Stack;

對棧的操作

棧初始化

_top可以初始化為0,此時棧頂元素是_top-1的位置

_top也可以初始化為1,此時棧頂元素就是_top的位置

初始化為0

初始化為1

// 初始化棧
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}

壓棧(入棧)

// 入棧
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//擴容
	if (ps->_capacity == ps->_top)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[ps->_top++] = data;
}

出棧

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

取棧頂元素

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

判斷棧是否為空

bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;
}

棧的長度

_top初始化為0,此時的_top的大小剛好就是棧的長度

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

棧銷毀

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

完整總代碼

頭文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>
// 支持動態(tài)增長的棧
typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;//數(shù)組
	int _top; // 棧頂,類似順序表中的_size
	int _capacity; // 容量
}Stack;
// 初始化棧
void StackInit(Stack* ps);
// 入棧
void StackPush(Stack* ps, STDataType data);
// 出棧
void StackPop(Stack* ps);
// 獲取棧頂元素
STDataType StackTop(Stack* ps);
// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps);
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
bool StackEmpty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);

函數(shù)定義

#include"Stack.h"
// 初始化棧
void StackInit(Stack* ps)
{
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = 0;
}
// 入棧
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);
	//擴容
	if (ps->_capacity == ps->_top)
	{
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * (ps->_capacity);
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_a[ps->_top++] = data;
}
// 出棧
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));
	
	ps->_top--;
}
// 獲取棧頂元素
STDataType StackTop(Stack* ps)
{
	assert(ps);
	return ps->_a[ps->_top-1];
}
// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->_top;
}
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
bool StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;
}
// 銷毀棧
void StackDestroy(Stack* ps)
{
	assert(ps);
	ps->_capacity = ps->_top = 0;
	free(ps->_a);
	ps->_a = NULL;
}

測試

#include"Stack.h"
void test()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
 
	while (StackSize(&s)>0)
	{
		printf("%d ", StackTop(&s));
		StackPop(&s);
	}
	StackDestroy(&s);
}
int main()
{
	test();
	return 0;
}

到此這篇關(guān)于C語言實現(xiàn)數(shù)組棧的代碼示例的文章就介紹到這了,更多相關(guān)C語言數(shù)組棧內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析int*p[ ]與int(*p)[ ]的區(qū)別

    淺析int*p[ ]與int(*p)[ ]的區(qū)別

    以下是對int*p[ ]與int(*p)[ ]的區(qū)別進行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境

    windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境

    這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • QT編寫tcp通信工具(Client篇)

    QT編寫tcp通信工具(Client篇)

    這篇文章主要介紹了QT編寫tcp通信工具,適用于Client端,類似網(wǎng)上常見的網(wǎng)絡(luò)調(diào)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言中的數(shù)據(jù)類型詳解

    C語言中的數(shù)據(jù)類型詳解

    在C語言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個廣泛的系統(tǒng)。變量的類型決定了變量存儲占用的空間,以及如何解釋存儲的位模式,本文將詳細(xì)給大家介紹一下C語言中的基本數(shù)據(jù)類型,感興趣的同學(xué)可以參考下
    2023-05-05
  • C++11新特性之變長參數(shù)模板詳解

    C++11新特性之變長參數(shù)模板詳解

    本文主要介紹了C++11變長參數(shù)模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C語言實現(xiàn)簡單的定時器

    C語言實現(xiàn)簡單的定時器

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單的定時器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Qt中定時器 QTimerEvent 和 QTimer的使用

    Qt中定時器 QTimerEvent 和 QTimer的使用

    Qt框架中的定時器功能主要包括兩種實現(xiàn)方式,包括QTimerEvent和QTimer,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • C++11中R字符串的作用小結(jié)

    C++11中R字符串的作用小結(jié)

    這篇文章主要介紹了C++11中R字符串的作用小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-07-07
  • C++入門之vector的底層實現(xiàn)詳解

    C++入門之vector的底層實現(xiàn)詳解

    這篇文章主要為大家介紹了C++入門之vector的底層實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++實現(xiàn)簡易萬年歷

    C++實現(xiàn)簡易萬年歷

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)簡易萬年歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

通化市| 高邑县| 吉林省| 保德县| 襄樊市| 通州市| 西平县| 抚宁县| 宁化县| 厦门市| 淮北市| 东方市| 武宁县| 海阳市| 望都县| 东阳市| 张家口市| 景宁| 青海省| 会同县| 东乡族自治县| 香格里拉县| 米易县| 娄底市| 马公市| 大悟县| 特克斯县| 庆阳市| 湘乡市| 高台县| 泗水县| 永德县| 内丘县| 黎川县| 英德市| 客服| 竹山县| 财经| 长泰县| 水城县| 阿图什市|