C 基于数组存储的堆栈实现

一、堆栈简介

对于需要管理的队列,主要操作是在序列的末尾插入和取出(删除)元素,有这样操作要求的序列我们称之为堆栈(Stack)。

堆栈可以认为是具有一定约束的线性表,插入和删除都作用在一个称为栈顶(Top)的位置。日常生活中和也可以看到堆栈的例子,例如对厨房中叠放的盘子来说,使用盘子(删除操作)时从顶端拿走盘子,用完放回(插入操作)时也是放到顶端。

通常把数据插入称为压入栈(Push),数据取出(删除)叫做弹出栈(Pop)。正是由于最后入栈的元素最先弹出这一特性,堆栈也被称为后入先出(Last In First Out, LIFO)表。

二、堆栈的抽象数据类型定义及基本操作

typedef struct SNode* PtrToSNode;
struct SNode
{
	int* Data;//存放堆栈元素的数组
	int Top;//记录栈顶位置
	int MaxSize;//记录堆栈长度
};

类型名称:堆栈(Stack)。

数据对象集:一个有0个或多个元素的有穷线性表。

操作集:对于一个具体长度为正整数MaxSize的堆栈S来说,对堆栈中的任一元素X来说,有以下操作:

1、PtrToSNode Create(int max):创建一个最大容量为max的空堆栈

PtrToSNode Create(int max)
{
	PtrToSNode s = (PtrToSNode)malloc(sizeof(struct SNode));//开辟堆栈所需要的空间
	s->Data = (int*)malloc(max * sizeof(int));//开辟存储堆栈数据的数组所需要的空间
	s->Top = -1;//Top记录当前栈顶元素的下标值,置为-1,说明栈为空
	s->MaxSize = max;//堆栈的最大容量
	return s;
}

2、bool IsFull(PtrToSNode s):判断堆栈是否已满

bool IsFull(PtrToSNode s)
{
	return (s->Top  == s->MaxSize  - 1);
}

3、bool Push(PtrToSNode s, int num):入栈

bool Push(PtrToSNode s, int num)
{
	if (! IsFull(s))
	{
		s->Top++;
		s->Data[s->Top] = num;
		return true;
	}
	else
	{
		printf("栈已满!");
		system("pause");
		return false;
	}
}

4、bool IsEmpty(PtrToSNode s):判断堆栈是否空

bool IsEmpty(PtrToSNode s)
{
	return (s->Top  == -1);
}

5、int Pop(PtrToSNode s):出栈

int Pop(PtrToSNode s)
{
	if (!IsEmpty(s))
	{
		int num = s->Data[s->Top];
		s->Top--;
		return num;
	}
	else
	{
		printf("堆栈空!");
		system("pause");
		return -1;
	}
}

 

posted @ 2018-08-17 09:19  秋沐霖  阅读(887)  评论(0编辑  收藏  举报
Live2D