数据结构C语言实现-栈

C语言实现栈(Stack)

运行环境:Dev-C++ 5.11
编程语言:C

一、栈是什么?

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。【1】摘自百度

的特点概括为:先进后出后进先出

二、有关数据及操作:数据类型,初始化,压栈、出栈(弹栈)

  1. 因为栈只在一段进行操作,因此不会和队列一样容易引起结构变化。
  2. 在本程序中使用数组来存储数据,易于学习理解。<如果感兴趣,可以使用链表存储。>
  3. 控制栈的标识为栈顶top(int型,本程序没有使用栈底bottom标识),在这里一方面标识栈顶,另一方面表示数组的下标。
  4. 本程序创建栈变量后,必须初始化,否则会报错。<这里仅作为学习分享,可以自行修改>
  5. 本程序栈中所存储的类型为char,可修改自定义名ch指代的数据类型,来修改栈中所存储的类型。
  6. 默认存储数据个数为100,实际只能存储99(具体看第7点和程序代码),可以手动调,在自定义宏里
  7. 本程序关于栈的操作函数,对栈类型参数的调用都是取地址(栈类型指针),注意函数使用参数类型。

栈空:top指向数组下标为0,表示数组为空,故栈也为空。
栈空示意图

栈满:数组大小为MaxStack,故数组下标最大为MaxStack-1,当top为MaxStack-1时,认为栈满,防止数组下标越界。
栈满示意图

三、程序代码

代码如下(示例):

#include <stdio.h>
#include <stdlib.h>
#define MaxStack 100

typedef char ch; 
typedef struct node
{
	int top;
	ch entry[MaxStack];
}Stack;

void CreateStack(Stack *s)		//初始化栈 
{
	s->top=0;
}

int StackEmpty(Stack *s)	//判栈空 
{
	if(s->top<=0)
		return 1;
	else
		return 0;
} 

int StackFull(Stack *s)		//判栈满 
{
	if(s->top >= MaxStack-1)
		return 1;
	else
		return 0;
} 

void Push(ch item,Stack *s)		//将ch类型的数据压入s栈中 
{
	if(StackFull(s))		//若栈未满 
	{
		printf("Stack is Full!!!");
		exit(0);
	}	
	else
		s->entry[s->top++]=item; //这种情况top为数组栈顶第一个为空的位置,Pop函数类似 
}

void Pop(ch *item,Stack *s)		//将s栈顶的数据弹出,并赋值给item 
{
	if(StackEmpty(s))		//若栈不空 
	{
		printf("Stack is Empty!!!");
		exit(0);
	}
	
	else
		*item=s->entry[--s->top];
}

ch GetStackTop(Stack *s)		//获取s栈顶的数据,并返回 
{
	if(StackEmpty(s))		//若栈不空 
	{
		printf("Stack is Empty!!!");
		exit(0);
	}
	
	else
		return s->entry[s->top-1];
}

int main()
{
	return 0;
}

总结

本程序中只含有关于栈数据结构的部分介绍,更加详细的使用和说明可以通过自己网上查阅资料或是查看其他博主的文章来获取。如果你已经掌握了有关栈的学习,你可以利用栈实现简单的程序以来解决问题,如对序列的逆序,结合队列判断回文序列等等。希望你在浏览本文章后有所收获!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心,你呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值