栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

c语言数据结构栈操作

文章目录
  • c语言数据结构栈操作
  • 前言
  • 一、栈的基本概念
  • 二、栈的基本操作
  • 三、栈的顺序存储结构
    • 3.1 栈的初始化
    • 3.2 栈为空判断
    • 3.3 入栈Push
    • 3.4 出栈Pop
    • 3.5 获取栈顶元素
  • 四、栈的共享实现
    • 4.1 栈的初始化
    • 4.2 入栈Push
    • 4.3 出栈
    • 4.4 栈顶元素获取
    • 4.5 判断栈是否为满栈
    • 4.6 判断栈是否为空栈
  • 五、 总体代码


前言 一、栈的基本概念

简单来说栈(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("栈顶元素:%dn",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("栈顶元素为:%dn",*(--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 
#include 
#include 


#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("栈顶元素为:%dn",*(--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;

}

运行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号