C语言实现栈

文章目录

  • 前言
  • 一、栈的定义
  • 二、栈的基本功能函数
    • 1.初始化栈
    • 2.入栈
    • 3.出栈
    • 4.获取栈顶元素
    • 5.获取栈中有效元素个数
    • 6.检测栈是否为空,如果为空返回非零结果,如果不为空返回0
    • 7.销毁栈
  • 三、总体测试代码
  • 总结


前言

在学习数据结构时我们需要用C语言实现对栈功能的基本实现,下面将为大家介绍下如何用C语言实现栈的基本功能。


一、栈的定义

下面的代码是定义栈的结构和功能函数的定义。
其中在定义int型时:typedef int STDataType ,用到了该语句进行定义其目的是有两个:
1.表明该类型的特殊作用。
2.为了方便以后改变数据类型而做的定义,如果以后要改变数据类型我们可以直接在该语句中进行修改就可以。

// 支持动态增长的栈
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);

// 获取栈中有效元素个数 
int StackSize(Stack* ps);

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);

// 销毁栈 
void StackDestroy(Stack* ps);

二、栈的基本功能函数

1.初始化栈

代码如下(示例):

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

2.入栈

代码如下(示例):

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

3.出栈

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

	--ps->_top;
}

4.获取栈顶元素

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(ps->_top > 0);

	return ps->_a[ps->_top - 1];
}

5.获取栈中有效元素个数

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

6.检测栈是否为空,如果为空返回非零结果,如果不为空返回0

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

7.销毁栈

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

三、总体测试代码

test.c代码:

#define _CRT_SECURE_NO_WARNINGS 1


#include"test.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->_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] = 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;
}

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->_top == 0;
}

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

test.h代码:

#pragma once
#include
#include
#include

// 支持动态增长的栈
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);

// 获取栈中有效元素个数 
int StackSize(Stack* ps);

// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);

// 销毁栈 
void StackDestroy(Stack* ps);

main.c代码:

#define _CRT_SECURE_NO_WARNINGS 1


#include"8_17test.h"

test1()
{
	Stack s1;
	StackInit(&s1);
	StackPush(&s1, 1);
	StackPush(&s1, 2);
	StackPush(&s1, 3);
	StackPush(&s1, 4);
	StackPush(&s1, 5);
	while (!StackEmpty(&s1))
	{
		printf("%d ", StackTop(&s1));
		StackPop(&s1);
	}
	printf("\n");
	StackDestroy(&s1);
}


int main()
{
	test1();
	return 0;
}

上述的测试代码只是提供一个案例,大家可自行编辑main.c函数进行测试函数功能。


总结

以上就是对C语言实现栈的基本功能的介绍和样例代码供大家参考。

你可能感兴趣的:(C语言知识简介,数据结构,c语言)