详解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++的virtual和override作用及说明

    c++的virtual和override作用及说明

    这篇文章主要介绍了c++的virtual和override作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • c++大数阶乘的实现方法

    c++大数阶乘的实现方法

    本篇文章对c++的大数阶乘进行了代码示例的介绍。需要的朋友参考下
    2013-05-05
  • Qt实现图片移动实例(图文教程)

    Qt实现图片移动实例(图文教程)

    这学期实训的时候用MFC做过一个飞机大战,很无聊的东西,一直想用Qt做一个;首先需要解决的问题是图片的移动,怎么说飞机啊子弹啊都是动着的,图片当然要跑起来,感兴趣的你可不要走开啊
    2013-01-01
  • 一波C语言二元查找树算法题目解答实例汇总

    一波C语言二元查找树算法题目解答实例汇总

    这篇文章主要介绍了一波C语言二元查找树算法题目解答实例汇总,包括按层次遍历和转换为镜像等基本算法题目,需要的朋友可以参考下
    2016-03-03
  • OpenMP 共享内存的并行编程框架入门详解

    OpenMP 共享内存的并行编程框架入门详解

    这篇文章主要为大家介绍了OpenMP 共享内存的并行编程框架入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • C++中赋值初始化和直接初始化的区别

    C++中赋值初始化和直接初始化的区别

    赋值初始化和直接初始化虽然常常产生相同的结果,但在某些情况下它们有不同的含义和行为,本文主要介绍了C++中赋值初始化和直接初始化的区别,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 详解Matlab如何绘制桑基图

    详解Matlab如何绘制桑基图

    桑基图是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,通常应用于能源、材料成分、金融等数据的可视化分析。本文将用Matlab绘制好看的桑基图,需要的可以参考一下
    2022-03-03
  • 详解C语言中的ttyname()函数和isatty()函数的用法

    详解C语言中的ttyname()函数和isatty()函数的用法

    这篇文章主要介绍了C语言中的ttyname()函数和isatty()函数的用法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Qt重写QStackedWidget模拟实现home界面滑动效果

    Qt重写QStackedWidget模拟实现home界面滑动效果

    这篇文章主要为大家详细介绍了Qt如何通过重写QStackedWidget模拟实现home界面滑动效果,文中的实现过程讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • C语言实现英文单词助手

    C语言实现英文单词助手

    这篇文章主要为大家详细介绍了C语言实现单词小助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论