数据结构与算法 (栈的基本操作)

基本数据结构与算法

(1)栈的基本操作

一.用数组实现

//定义节点结构
#define MaxSize <数组元素个数>
typedef struct sNode{
    ElemType data[MaxSize];
    int		 top;
}stack;
//创建栈
stack* createStack()
{
	stack* s=(stack*)malloc(sizeof(stack));
	s->top=-1;//数组下标为-1时代表为空栈
	return s;
}
//压栈操作
void push (stack* ptrS,ElemType item)
{
		if(ptrS->top==MaxSize-1)//数组下表从零开始,故判断MaxSize-1为栈满情况
		{
			printf("栈已满")return}
		else
		{
		//先让头部指针向上移动,再添加数据元素
			ptrS->data[++top]=item;
			return;
		}
}
//出栈
ElemType pop(stack* ptrS)
{
	if(ptrS->top==-1)
	{
		printf("栈已空");
		return NULL;
	}
	else
	{
		//取得数据后让top向下移
		return ptrS->data[ptrS->top--];
	}
}
//判断栈是否为空
bool isEmpty(stack* ptrS)
{
	if(ptrS->top==-1)
	return true;
	else
	return false;
}
//判断栈是否已满
bool isFull(stack* ptrS)
{
	if(ptrS->top==MaxSize-1)
		return true;
		else
		return false;
}
//求栈的深度
int Size(stack* ptrS)
{
	return ptrS->top+1;//数组从零开始,故需加一
}
//获取栈顶元素
ElemType top(stack* ptrS)
{
	if(ptrS->top==-1)//栈为空
	{
		return NULL;
	}
	return ptrS->data[top];
}

用数组实现栈时由于要预先分配后好存储空间,故在大多数时候会造成空间资源的浪费,因此为了提高空间利用率,采用两个栈各自向中间延伸的方法。

#define MaxSize <数据最大存储量>
typedef struct sNode
{	
	ElemType data[MaxSize];
	int top1;
	int top2;
}stack;
void initStack(stack* ptrS)
	{
	ptrS->top1=-1;
	ptrS->top2=MaxSize;
	}
void push(stack* ptrS,ElemType item,int tag)
{/*tag作为标志,取值为1时向第一个栈中加入数据,为2时向第二个栈中加入数据*/
	if(ptrS->top2-ptrS->top1==1)
	{
		printf("栈已满")return;
	}
	else if(tag==1)
	{
	//和单一栈的操作一致
		ptrS->data[++ptrS->top1]=item;
	}
	else if(tag==2)
	{	
	//和单一栈的操作一致	
	ptrS->data[++ptrS->top2]=item;
	}
}
ElemType pop(stack* ptrS,int tag)
{
	if(tag==1)
	{
		if(ptrS->top1==-1)
			{
				printf("栈1已空");
				return NULL;
			}
		else
			return ptrS->data[ptrS->top1--];
	}
	else
	{
		if(ptrS->top2==MaxSize)
		{
			printf("栈2已满");
			return NULL;	
		}
		else
			return ptrS->data[ptrS->top2--];
	}
}

二.用链表实现

栈的链式存储结构实际上是一个单链表,栈的入栈与出栈只能在链表的头部进行。

//定义链表的栈节点
typedef struct sNode 
{
	ElemType Data;
	sNode*   next;
}stack;
/*构建一个链表头指针*/
stack* createStack()
{
	stack* s=(stack*)malloc(sizeof(stack));
	s->next=NULL;
	return s;
}
void push(stack* ptrS,ElemType item)
{
	//创建新的节点
	stack* tmp=(stack*)malloc(sizeof(stack));
	tmp->Data=item;//将数据元素赋值给新节点的数据域
	tmp->next=ptrS->next;//将新节点的指针域指向下一节点
	ptrS->next=tmp;//将头节点的指针域指向新节点
}
ElemType pop(stack* ptrS)
{
	/*弹栈操作*/
	ElemType elem;//存储弹栈数据
	stack* p=ptrS->next;//创建临时指针指向弹栈节点
	ptrS->next=p->next;//让头指针指向后一个节点
	elem=p->Data;
	free(p);//释放掉出栈后元素对应的内存空间
	return elem;
}
bool isEmpty(stack* ptrS)
{
/*判断栈是否为空*/
	if(ptrS->next==NULL)
	return true;
	else
	return false;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值