【c语言数据结构栈操作】

c语言数据结构栈操作


前言

一、栈的基本概念

简单来说栈(Stack)就是只允许在一段进行插入或删除的线性表
重要术语:栈顶、栈低、空栈
栈的特点:后进先出(LIFO)

在这里插入图片描述

二、栈的基本操作

1)InitStack(&stack);初始化栈,构造一个空栈stack,分配内存空间
2) DestroyStack(&Stack);销毁栈,销毁并释放栈stack所占用空间
3) Push(&stack,&x);进栈,若栈未满,则将x元素加入成为新栈顶
4)Pop(&stack,&x);出栈,若栈非空,则弹出栈顶元素,并返回X
5)GetTop(&stack,&x);读栈顶元素,若栈stack非空,则用x返回栈顶元素
6) StackEmpty(&stack);判断一个stack栈是否为空

三、栈的顺序存储结构

#define MAXSize 10     //定义栈的最大值
typedef struct Stack
{
	int data[MAXSize];  //栈元素  
	int top;   //栈指针
}SqStack;

3.1 栈的初始化

//栈初始化
void InitStack(SqStack *s)
{
	s->top = -1; //初始化栈指针
}

3.2 栈为空判断

//栈为空判断
int StacEmptyk(SqStack *s)
{
	if(s->top == -1)
	{
		return 0; //栈为空
	}
	return 1; //栈不为空
}

3.3 入栈Push

//进栈
int Push(SqStack *s,int dat)
{
	if(s->top == MAXSize-1)  //栈满了
	{
		return 0;
	}
	s->top = s->top +1; //指针先加1
	s->data[s->top] = dat;  //赋值
	return 1;
}

3.4 出栈Pop

//出栈
int Pop(SqStack *s,int *dat)
{
	if(s->top == -1) //栈空
	{
		return 0;
	}
	else{
	*dat = s->data[s->top];
	s->top--; //指针减一
	}
	return *dat;
}

3.5 获取栈顶元素

//获取栈顶元素
void GetTop(SqStack *s)
{
	if(s->top == -1)
	{
		printf("栈为空\n");
	}
	else{
		printf("栈顶元素:%d\n",s->data[s->top]);
	}
}

四、栈的共享实现

typedef struct{
	SDataType *base; //栈底指针
	SDataType *top;  //栈顶指针
	int StackSize;   //当前已经分配的存储空间,以元素为单位 
}SqStack;

在这里插入图片描述

4.1 栈的初始化

这里使用top和base两个指针来标记栈顶和栈低的位置,最开始时两个指针都指向栈低

Status InitStack(SqStack *S)
{
	S->base = (Element *)malloc(sizeof(Element) *MAX_Stack);
	if(NULL == S->base)
	{
		printf("栈初始化失败\n");
		return -1;
	}
	//S->top始终指向栈顶元素的下一个位置
	S->top = S->base;   //初始化下状态为空
	S->StackSize = MAX_Stack;  //初始化当前栈的最大容量
	return 1;
}

4.2 入栈Push

//入栈
Status Push(SqStack *S,DataType x)
{
	DataType *p;
	//首先判断栈是否满的(上溢出)
	if(S->top - S->base == S->StackSize)
	{
		//追加空间
		p = (Element *)realloc(S->base,(MAX_Stack+ADD_Stack * sizeof(Element)));
		if(NULL == p)
		{
			printf("追加失败\n");
			return -1;
		}
		//成功找到则使s->base指向p
		S->base = p;
		S->top = S->base + S->StackSize;
		S->StackSize += ADD_Stack;
	}
	//先插入元素,然后栈顶指针加1
	*(S->top) = x;
	S->top++;
	return 1;
}

4.3 出栈

//出栈
Status Pop(SqStack *S,DataType  *x)
{
	//判断是否会发生下溢
	if(S->top != S->base)
	{
		S->top--;  //先把栈顶指针减1
		*x = *(S->top);
	}
	else{
		return -1;
	}
	return *x;
}

4.4 栈顶元素获取

//获取栈顶元素
void GetTop(SqStack *s)
{
	if(s->top != s->base)
	{
		printf("栈顶元素为:%d\n",*(--s->top));
		s->top++;  //获取栈顶元素后再将栈指针移回去不然打印时会少一个 
	}
	else{
		printf("栈空\n");		
	}
}

4.5 判断栈是否为满栈

//判断是否为满栈
void IsFullStack(SqStack *s)
{
	if(s->top - s->base == s->StackSize)
	{
		printf("栈满\n");
	}
	else{
		printf("栈未满\n");
	}
}

4.6 判断栈是否为空栈

//判断是否为空栈
void IsEmptyStack(SqStack *s)
{
	if(s->top == s->base)
	{
		printf("栈空\n");
	}
	else{
		printf("栈非空\n");
	}
}

五、 总体代码


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


#define MAX_Stack  100  //默认最大容量
#define ADD_Stack  20   //追加容量
typedef int Element;
typedef int DataType;
typedef int Status;

typedef struct Stack
{
	Element *top;  //栈顶指针
	Element *base; //栈低指针
	int StackSize;    //栈的空间
}SqStack;



Status InitStack(SqStack *S)
{
	S->base = (Element *)malloc(sizeof(Element) *MAX_Stack);
	if(NULL == S->base)
	{
		printf("栈初始化失败\n");
		return -1;
	}
	//S->top始终指向栈顶元素的下一个位置
	S->top = S->base;   //初始化下状态为空
	S->StackSize = MAX_Stack;  //初始化当前栈的最大容量
	return 1;
}


//入栈
Status Push(SqStack *S,DataType x)
{
	DataType *p;
	//首先判断栈是否满的(上溢出)
	if(S->top - S->base == S->StackSize)
	{
		//追加空间
		p = (Element *)realloc(S->base,(MAX_Stack+ADD_Stack * sizeof(Element)));
		if(NULL == p)
		{
			printf("追加失败\n");
			return -1;
		}
		//成功找到则使s->base指向p
		S->base = p;
		S->top = S->base + S->StackSize;
		S->StackSize += ADD_Stack;
	}
	//先插入元素,然后栈顶指针加1
	*(S->top) = x;
	S->top++;
	return 1;
}


//出栈
Status Pop(SqStack *S,DataType  *x)
{
	//判断是否会发生下溢
	if(S->top != S->base)
	{
		S->top--;  //先把栈顶指针减1
		*x = *(S->top);
	}
	else{
		return -1;
	}
	return *x;
}


//栈元素打印
void PrintStack(SqStack *s)
{
	while(s->top != s->base)
	{
		s->top--;
		printf("%d ",*(s->top));
	}
	printf("\n");
}


//获取栈顶元素
void GetTop(SqStack *s)
{
	if(s->top != s->base)
	{
		printf("栈顶元素为:%d\n",*(--s->top));
		s->top++;  //获取栈顶元素后再将栈指针移回去不然打印时会少一个 
	}
	else{
		printf("栈空\n");		
	}
}

//判断是否为满栈
void IsFullStack(SqStack *s)
{
	if(s->top - s->base == s->StackSize)
	{
		printf("栈满\n");
	}
	else{
		printf("栈未满\n");
	}
}

//判断是否为空栈
void IsEmptyStack(SqStack *s)
{
	if(s->top == s->base)
	{
		printf("栈空\n");
	}
	else{
		printf("栈非空\n");
	}
}
int main(void)
{
	int i = 0;
	SqStack stack;
	DataType x;
	InitStack(&stack);
	for(i = 1;i<=5;i++)
	{
		Push(&stack,i);
	}
	GetTop(&stack);
	//PrintStack(&stack);
	IsFullStack(&stack);
	IsEmptyStack(&stack);
	
	while(stack.top != stack.base)
	{
		Pop(&stack,&x); //出栈元素
		printf("%d ",x);
	}
	printf("\n");
	
	return 0;

}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小殷学长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值