C语言提高篇-数据结构~栈

C语言提高篇-数据结构~栈

一、栈的基本特征和实现

1、 基本特征

具有后进先出特性的数据结构
LIFO
增加/删除元素都在数据结构的同一端操作,栈顶

二、 基本操作

创建 销毁 …

1、 使用顺序存储结构实现栈的基本操作

示例如下:

//使用顺序存储结构实现栈的基本操作
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//定义栈的数据类型
typedef struct
{
	//int arr[5];
	int* arr; //记录顺序结构存储空间首地址
	int len;  //记录顺序存储空间的大小
	int top;  //记录栈顶位置的下标
}Stack;

//实现栈的创建
Stack* create(int len);
//实现栈的销毁
void destroy(Stack* ps);
//判断栈是否为满
bool full(Stack* ps);
//判断栈是否为空
bool empty(Stack* ps);
//实现入栈操作
void push(Stack* ps,int data);
//遍历栈中的所有元素
void travel(Stack* ps);
//计算栈中元素的个数
int size(Stack* ps);
//查看栈顶元素的值
int peek(Stack* ps);
//实现出栈的操作
int pop(Stack* ps);

int main(void)
{
	//栈的创建
	Stack* ps = create(5);
	/*
	if(full(ps))
	{
		printf("栈已经满了\n");
	}
	else
	{
		printf("栈没有满\n");
	}
	*/
	printf("%s\n",full(ps)?"栈满了":"栈没有满"); //栈没有满
	printf("%s\n",empty(ps)?"栈空了":"栈没有空"); //栈空了

	printf("---------------------\n");
	int i = 0;
	for(i = 1; i < 7; i++)
	{
		push(ps,10*i+i);
	}
	travel(ps);// 11 22 33 44 55  

	printf("---------------------\n");
	printf("栈中的元素个数是:%d\n",size(ps)); // 5
	printf("栈中的栈顶元素是:%d\n",peek(ps));// 55
	printf("出栈的元素是:%d\n",pop(ps));//55
	printf("栈中的元素个数是:%d\n",size(ps)); // 4
	printf("栈中的栈顶元素是:%d\n",peek(ps)); // 44
	travel(ps); // 11 22 33 44 


	//栈的销毁
	destroy(ps);
	ps = NULL;
	return 0;
}

//实现出栈的操作
int pop(Stack* ps)
{
	//判断栈是否为空
	if(empty(ps))
	{
		return -1;//表示出栈失败
	}
	// 标记该元素所在位置为无效元素位置
	return ps->arr[--ps->top];
}

//计算栈中元素的个数
int size(Stack* ps)
{
	return ps->top;
}
//查看栈顶元素的值
int peek(Stack* ps)
{
	/*
	//判断栈是否为空
	if(empty(ps))
	{
		return -1;//表示查看失败
	}
	return ps->arr[ps->top-1];
	*/
	return empty(ps)?-1:ps->arr[ps->top-1];
}

//遍历栈中的所有元素
void travel(Stack* ps)
{
	printf("栈中的元素有:");
	int i = 0;
	for(i = 0; i < ps->top; i++)
	{
		printf("%d ",ps->arr[i]);
	}
	printf("\n");
}

//实现入栈操作
void push(Stack* ps,int data)
{
	//判断栈是否为满
	if(full(ps))
	{
		printf("栈已经满了,入栈失败\n");
		return; //结束当前函数
		//exit(0); 结束整个程序
	}
	//ps->arr[ps->top] = data;
	//ps->top++;
	ps->arr[ps->top++] = data;
}

//判断栈是否为满
bool full(Stack* ps)
{
	/*
	if(ps->top == ps->len)
	{
		return true;//表示栈满了
	}
	return false; //表示栈没有满
	*/
	return ps->top == ps->len;
}

//判断栈是否为空
bool empty(Stack* ps)
{
	return  0 == ps->top;
}

//实现栈的销毁
void destroy(Stack* ps)
{
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
}

//实现栈的创建
Stack* create(int len)
{
	// Stack stack;
	// 永远不要返回一个局部变量的地址
	// return &stack;
    //创建栈
	Stack* ps = (Stack*)malloc(sizeof(Stack));
	//初始化栈中的成员
	ps->arr = (int*)malloc(sizeof(int)*len);
	ps->len = len;
	ps->top = 0;
	//返回创建出来的栈的首地址
	return ps;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值