详解C语言之堆栈

 更新时间:2021年11月17日 15:24:04   作者:ぃ咔哇依°ヽ  
这篇文章主要为大家介绍了C语言的堆栈,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、何为堆栈?

a.堆栈是一种特殊的线性表

b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表

c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底

d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈

堆栈

二、思维导图

堆栈

三、代码

1、顺序堆栈

#include <stdio.h>
typedef int DataType;
#define MaxStackSize 64
typedef struct
{
	DataType stack[MaxStackSize];
	int top;
}SeqStack;
//初始化
void StackInit(SeqStack *S)
{
	S->top = 0;
}
//判断是否栈空
int StackIsEmpty(SeqStack S)
{
	if (S.top <= 0)
		return 0;
	else
		return 1;
}
//入栈
int StackPush(SeqStack *S, DataType x)
{
	if (S->top >= MaxStackSize)
	{
		printf("栈满,无法进栈!!!\n");
		return 0;
	}
	else
	{
		S->stack[S->top] = x;
		S->top++;
		return 1;
	}
}
//出栈
int StackPop(SeqStack *S, DataType *x)
{
	if (S->top <= 0)
	{
		printf("堆栈已空,无法出栈!!!\n");
		return 0;
	}
	else
	{
		S->top--;
		*x = S->stack[S->top];
		return 1;
	}
}
//获取栈顶元素
int StackGetTop(SeqStack S, DataType *x)
{
	if (S.top <= 0)
	{
		printf("堆栈已空!!!\n");
			return 0;
	}
	else
	{
		*x = S.stack[S.top - 1];
		return 1;
	}
}
int main()
{
	SeqStack myStack;
	int i, x;
	StackInit(&myStack);
	for (i = 0; i < 10; i++)
		StackPush(&myStack, i + 1);
	StackGetTop(myStack, &x);
	printf("当前栈顶元素为:%d\n", x);
	printf("依次出栈:");
	while (StackIsEmpty(myStack))
	{
		StackPop(&myStack, &x);
		printf("%d ", x);
	}
	system("pause");
	return 0;
}

2、链式堆栈

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
	DataType data;
	struct snode *next;
}LSNode;
//初始化
void StackInit(LSNode **top)
{
	*top = (LSNode *)malloc(sizeof(LSNode));
	(*top)->next = NULL;
}
//判断堆栈是否非空
int StackIsEmpty(LSNode *top)
{
	if (top->next == NULL)
		return 0;
	else
		return 1;
}
//入栈
void StackPush(LSNode *top, DataType x)
{
	LSNode *p;
	p = (LSNode *)malloc(sizeof(LSNode));
	p->data = x;
	p->next = top->next;
	top->next = p;
}
//出栈
int StackPop(LSNode *top, DataType *x)
{
	LSNode *p = top->next;
	if (p == NULL)
	{
		printf("堆栈已空,删除错误!!!\n");
		return 0;
	}
	top->next = p->next;
	*x = p->data;
	free(p);
	return 1;
}
//获取栈顶元素
int StackGetTop(LSNode *top, DataType *x)
{
	LSNode *p = top->next;
	if (p == NULL)
	{
		printf("堆栈已空,取出错误!!!\n");
		return 0;
	}
	*x = p->data;
	return 1;
}
//释放内存空间
void StackDestroy(LSNode **top)
{
	LSNode *p, *q;
	p = *top;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*top = NULL;
}
int main()
{
	int i, x;
	LSNode *top;
	StackInit(&top);
	for (i = 0; i < 10; i++)
		StackPush(top, i + 1);
	StackGetTop(top, &x);
	printf("当前栈顶元素为%d\n", x);
	printf("依次出栈:");
	while (StackIsEmpty(top))
	{
		StackPop(top, &x);
		printf("%4d", x);
	}
	StackDestroy(&top);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++读写INI配置文件的类实例

    C++读写INI配置文件的类实例

    这篇文章主要介绍了C++读写INI配置文件的类,实例分析了C++操作ini配置文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C语言实现像素鸟游戏

    C语言实现像素鸟游戏

    这篇文章主要为大家详细介绍了C语言实现像素鸟游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言 用指针作为函数返回值详解

    C语言 用指针作为函数返回值详解

    本文主要介绍C语言 用指针作为函数返回值,这里整理了相关资料及示例代码,帮助大家学习理解此部分知识,有需要的同学可以参考下
    2016-08-08
  • C++类型转换详解

    C++类型转换详解

    类型转换有c风格的,当然还有c++风格的。c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换
    2021-10-10
  • C/C++获取主机网卡MAC地址的三方法

    C/C++获取主机网卡MAC地址的三方法

    MAC地址(Media Access Control address),又称为物理地址或硬件地址,是网络适配器(网卡)在制造时被分配的全球唯一的48位地址,通过获取MAC地址可以判断当前主机的唯一性可以与IP地址绑定并实现网络准入控制,本文给大家介绍了使用C/C++获取主机网卡MAC地址的三方法
    2023-11-11
  • Qt槽函数会被执行多次的问题原因及解决方法

    Qt槽函数会被执行多次的问题原因及解决方法

    本文主要介绍了Qt槽函数会被执行多次的问题原因及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • C++中的继承方式与菱形继承解析

    C++中的继承方式与菱形继承解析

    这篇文章主要介绍了C++中的继承方式与菱形继承解析,继承是类和类之间的关系,是代码复用的重要手段,允许在保持原有类结构的基础上进行扩展,创建的新类与原有的类类似,只是多了几个成员变量和成员函数,需要的朋友可以参考下
    2023-08-08
  • c语言文件读写示例(c语言文件操作)

    c语言文件读写示例(c语言文件操作)

    这篇文章主要介绍了c语言文件读写示例(c语言文件操作),需要的朋友可以参考下
    2014-02-02
  • C语言的入口函数的实现

    C语言的入口函数的实现

    在C语言的世界里,所有的程序都是用函数来装配的,main称之为主函数,是所有程序运行的入口,本文主要介绍了C语言的入口函数,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • c++先序二叉树的构建详解

    c++先序二叉树的构建详解

    在本篇文章里小编给大家分享了关于c++先序二叉树的构建的相关知识点,需要的朋友们跟着学习下。
    2019-04-04

最新评论