C语言实现顺序栈

C语言实现顺序栈

前言

最近在复习数据结构和C语言,就想照着自己的理解继续盲打代码。本次是实现了一个顺序栈,也就是采用静态分配的方式,这种方式实现起来比较简单。

后续还会练习实现链栈等数据结构。

栈是一种后进先出的数据结构,只允许在一端(栈顶)访问元素。

实现的功能

  • 初始化栈
  • 入栈
  • 出栈
  • 获取栈顶元素

主界面截图

image-20210906094012576

栈的定义

typedef int ElemType;//给数据类型取别名,此次存的是int类型,如果要存为其他类型只需要修改此处一次 
 
//-------结构体定义部分------ //
typedef struct{
	ElemType data[MaxSize];
	int top;//指向栈顶元素的指针 
	int length;//栈中实际存储的元素个数 
}MyStack;

因为是顺序栈,所以用普通数组的方式存储,我自己定义了一个length变量,可以根据这个变量来判断栈满栈空等。

**栈空:**top = -1 或 length = 0

**栈满:**top = MaxSize -1 或 length = MaxSize

栈的初始化

//栈的初始化 
bool InitStack(MyStack *S)
{
	//栈的初始化需要把栈顶指针赋值为-1,此时栈中元素个数为0 
	S->top = -1;
	S->length = 0;
	return true;
} 

入栈

只有栈不满才能入栈,所以需要先判断是否栈满。入栈时需要先将栈顶指针+1,再执行入栈操作。

//入栈 
bool Push(MyStack *S,ElemType e)
{
	if(S->top == MaxSize -1) //如果栈满  也可以判断 length==MaxSize  
		return false;
	else 
		S->data[++S->top] = e;//指针先加一再将元素入栈

	(S->length)++;	//栈中元素加一  
	return true;
} 

出栈

同上,只有栈不空才能出栈。出栈时先获取出栈元素在将栈顶指针-1.

//出栈
bool Pop(MyStack *S)
{
	ElemType x;//用x将出栈的结果输出 
	if(S->top == -1)//栈空 也可以判断 length==0
		return false;
	else
		x = S->data[S->top--];//先获得元素,指针再执行--操作
	printf("此次出栈的元素为:%d\n",x); 
	(S->length)--;	//栈中元素减一 
	return true;
} 

获取栈顶元素

获取栈顶元素就是直接访问栈顶指针此时指向的元素。

//获取当前栈顶元素
bool GetTop(MyStack *S,int *x)
{
	if(S->top == -1)//如果栈空,则没有栈顶元素 
		return false;
	else
		//printf("当前栈顶元素为:%d\n",S->data[S->top]);
		*x = S->data[S->top];//获得栈顶元素 
	return true;
} 

全部代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> //根据C99标准,C语言使用bool类型需要添加这个头文件
#define MaxSize 10	//顺序栈这里使用静态分配的方式,所以手动规定最大容量 

typedef int ElemType;//给数据类型取别名,此次存的是int类型,如果要存为其他类型只需要修改此处一次 
 
//-------结构体定义部分------ //
typedef struct{
	ElemType data[MaxSize];
	int top;//指向栈顶元素的指针 
	int length;//栈中实际存储的元素个数 
}MyStack;
//-------结构体定义部分------ //
 
//-------函数声明部分------ //
void MainMenu();
bool InitStack(MyStack *S);//栈的初始化 
bool Push(MyStack *S,ElemType e);//将元素e压入栈 
bool Pop(MyStack *S);//出栈
bool GetTop(MyStack *S,int *x);//获取当前栈顶元素 

//-------函数声明部分------ //
int main()
{
	int ch;//选择操作指令 
	int element;//入栈的元素 
	int x;//获取出栈的元素 
	MyStack S;
	InitStack(&S);//初始化一个栈 
	
	while(1)
	{
		MainMenu(); 
		printf("请输入您要执行的操作:");
		scanf("%d",&ch);
		
		switch(ch)
		{
			case 0:		printf("感谢使用,已退出!");	exit(0);	break;
			case 1:		printf("请输入您要入栈的元素:\n");
						scanf("%d",&element); 
						if(Push(&S,element))
							printf("入栈成功!\n");
						else
							printf("入栈失败!栈已满!\n");
						break;
			case 2:		
						if(Pop(&S))
							printf("出栈成功!\n");
						else
							printf("出栈失败!栈已空!\n");
						break;		
			case 3:		
						if(GetTop(&S,&x))
							printf("获取栈顶成功!当前栈顶元素为:%d\n",x);
						else
							printf("获取栈顶失败!栈已空!\n");
						break; 
			default:	printf("您输入的操作指令有误!请重新输入!");
		}
	}
	return 0;
}

//主菜单,显示 
void MainMenu()
{
	printf("\n\n\n");
	printf("\t      *************顺序栈的实现************\n\n"); 
	printf("\t      -------	0.退出 \n\n");
	printf("\t      -------	1.将数据入栈\n\n");
	printf("\t      -------	2.执行一次出栈操作\n\n");
	printf("\t      -------	3.获取当前栈顶元素\n\n");
	printf("\t      *************************************\n");
}

//栈的初始化 
bool InitStack(MyStack *S)
{
	//栈的初始化需要把栈顶指针赋值为-1,此时栈中元素个数为0 
	S->top = -1;
	S->length = 0;
	return true;
} 

//入栈 
bool Push(MyStack *S,ElemType e)
{
	if(S->top == MaxSize -1) //如果栈满  也可以判断 length==MaxSize  
		return false;
	else 
		S->data[++S->top] = e;//指针先加一再将元素入栈

	(S->length)++;	//栈中元素加一  
	return true;
} 

//出栈
bool Pop(MyStack *S)
{
	ElemType x;//用x将出栈的结果输出 
	if(S->top == -1)//栈空 也可以判断 length==0
		return false;
	else
		x = S->data[S->top--];//先获得元素,指针再执行--操作
	printf("此次出栈的元素为:%d\n",x); 
	(S->length)--;	//栈中元素减一 
	return true;
} 

//获取当前栈顶元素
bool GetTop(MyStack *S,int *x)
{
	if(S->top == -1)//如果栈空,则没有栈顶元素 
		return false;
	else
		//printf("当前栈顶元素为:%d\n",S->data[S->top]);
		*x = S->data[S->top];//获得栈顶元素 
	return true;
} 

功能测试

image-20210906095027728

image-20210906095205674

image-20210906095106275

栈满栈空测试可以自己多输入几个或多出栈几次就知道了。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值